es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Variable Global de JavaScript que no Cambia

Soy un traductor español que traduce documentos de TI. Traduce lo siguiente al español. No traduzcas el código y la salida en markdown.

Soy nuevo en JavaScript y hice un constructor de cronómetro simple:

function Stopwatch() {
var started = false;
var elapsed;
var start;
d = new Date();
this.duration = function() {
if (started) {
throw “El cronómetro sigue en marcha”
} else {
return (elapsed);
}
}
this.start = function() {
if (started) {
throw “El cronómetro ya ha comenzado”;
} else {
start = d.getTime();
started = true;
}
}
this.stop = function() {
if (!started) {
throw “El cronómetro no ha comenzado”;
} else {
elapsed = d.getTime() – start;
started = false;
}
}
this.reset = function() {
started = false;
elapsed = 0;
}
}
let sw = new Stopwatch();
sw.start();

setTimeout(function () {
sw.stop();
console.log(sw.duration());
}, 500);

La lógica de los errores funciona bien, pero cada vez que llamo a sw.duration (), siempre devuelve cero y no estoy seguro de por qué eso es ya que estoy usando var en lugar de let. Por favor, háganme saber.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con la duración siempre devolviendo cero se debe al hecho de que la variable elapsed nunca se establece realmente con un valor. Solo se establece cuando el cronómetro se detiene, por lo que si el cronómetro no se detuvo, elapsed seguirá estando sin definir.

    Para solucionar esto, puede inicializar elapsed en cero cuando se crea el cronómetro:

    function Stopwatch() {
        var started = false;
        var elapsed = 0;
        var start;
        d = new Date();
        this.duration = function() {
            if (started) {
                throw "El cronómetro todavía está en funcionamiento"
            } else {
                return (elapsed);
            }
        }
        this.start = function() {
            if (started) {
                throw "El cronómetro ya ha empezado"; 
            } else {
                start = d.getTime();
                started = true;
            }
        }
        this.stop = function() {
            if (!started) {
                throw "El cronómetro no ha empezado";
            } else {
                elapsed = d.getTime() - start;
                started = false;
            }
        }
        this.reset = function() {
            started = false;
            elapsed = 0;
        }
    }
    

    Además, la elección entre usar var y let en este caso no haría ninguna diferencia ya que el problema estaba en la inicialización de la variable elapsed en lugar de cualquier problema de ámbito.

Comments are closed.