Como resolver var do escopo dentro da chamada Settimeout
-
04-07-2019 - |
Pergunta
Estou tentando chamar um settimeout de dentro de um retorno de chamada 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);
O SetInterval funciona conforme o esperado, mas a chamada Settimeout está falhando. Eu acho que o problema está relacionado ao fato de estar referenciando uma variável (Myvar) que não está no escopo.
Qual é a melhor maneira de resolver isso?
Solução
Este é um candidato perfeito para fechamentos:
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);
Seu problema está relacionado ao escopo, e isso funcionaria em torno disso.
Outras dicas
Eu tive um problema parecido. A questão era que eu estava tentando chamar um método de dentro de si através de um setTimeout (). Algo assim, que não funcionou para mim:
function myObject() {
this.egoist = function() {
setTimeout( 'this.egoist()', 200 );
}
}
myObject001 = new myObject();
myObject001.egoist();
O seguinte também não funcionou:
... setTimeout( egoist, 200 );
... setTimeout( egoist(), 200 );
... setTimeout( this.egoist, 200 );
... setTimeout( this.egoist(), 200 );
... setTimeout( function() { this.egoist() }, 200 );
A solução foi usar com () declaração como assim:
function myObject() {
this.egoist = function() {
with (this) { setTimeout( function() { egoist() }, 200 );}
}
}
myObject001 = new myObject();
myObject001.egoist();
Claro, este é um ciclo sem fim, mas o ponto que estou destacando aqui é diferente.
Espero que isto ajude :)
Por uma questão de melhor prática, tente não usar strings como parâmetros para setTimeout
e setInterval
Porque isso vai invocar eval
... Usar o seguinte formulário também pode facilitar o entendimento/depuração:
setInterval(function () {
// do stuff
// ...
// now wait 2 secs then call someFunction
setTimeout(someFunction, 2000);
}, 10000);
Execute -o no Firefox e verifique as ferramentas | Console de erro. Se o Settimeout falhar, pode dizer por que lá.
Além disso, tente substituir "someFunction();"
com "alert('hi')"
(sem vírgula) e veja se isso funciona. Nesse caso, o problema é reduzido significativamente.