javascript - para - que es la felicidad filosofia
Cómo resolver Var fuera del alcance dentro de la llamada setTimeout (4)
Como una mejor práctica, trate de no utilizar cadenas como parámetros para setTimeout
y setInterval
porque eso invocará a eval
... Usar el siguiente formulario también puede hacer que este problema sea más fácil de comprender / depurar:
setInterval(function () {
// do stuff
// ...
// now wait 2 secs then call someFunction
setTimeout(someFunction, 2000);
}, 10000);
Intento llamar a setTimeout desde dentro de una devolución de llamada setInterval:
function callback()
{
//assign myVar
var myVar = document.getElementById("givenID");
//...
//now wait 2 secs then call some code that uses myVAr
setTimeout("myVar.innerHTML = ''TEST''", 2000);
}
setInterval("callback();", 10000);
setInterval funciona como se esperaba, pero la llamada a setTimeout está fallando. Supongo que el problema está relacionado con el hecho de que estoy haciendo referencia a una variable (myVar) que no está dentro del alcance.
¿Cuál es la mejor manera de resolver esto?
Ejecútalo en Firefox y mira Herramientas | Consola de error. si setTimeout falla, puede decirle por qué existe.
Además, intente reemplazar "someFunction();"
con "alert(''hi'')"
(sin punto y coma) y ver si eso funciona. Si es así, el problema se reduce significativamente.
Este es un candidato perfecto para cierres:
setInterval(
function ()
{
var myVar = document.getElementById("givenID");
setTimeout(
function()
{
// myVar is available because the inner closure
// gets the outer closures scope
myVar.innerHTML = "Junk";
},2000);
}, 10000);
Su problema está relacionado con el alcance, y esto funcionaría alrededor de eso.
Tuve un problema similar. El problema era que estaba tratando de llamar a un método desde dentro de sí mismo a través de un setTimeout (). Algo como esto, QUE NO FUNCIONÓ PARA MÍ:
function myObject() {
this.egoist = function() {
setTimeout( ''this.egoist()'', 200 );
}
}
myObject001 = new myObject();
myObject001.egoist();
Lo siguiente TAMPOCO FUNCIONÓ:
... setTimeout( egoist, 200 );
... setTimeout( egoist(), 200 );
... setTimeout( this.egoist, 200 );
... setTimeout( this.egoist(), 200 );
... setTimeout( function() { this.egoist() }, 200 );
La solución fue usar con la declaración () de esta manera:
function myObject() {
this.egoist = function() {
with (this) { setTimeout( function() { egoist() }, 200 );}
}
}
myObject001 = new myObject();
myObject001.egoist();
Por supuesto, este es un ciclo sin fin, pero el punto que estoy haciendo aquí es diferente.
Espero que esto ayude :)