Come risolvere Var al di fuori dell'ambito nell'ambito della chiamata setTimeout
-
04-07-2019 - |
Domanda
Sto provando a chiamare un setTimeout da un callback 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 funziona come previsto ma la chiamata setTimeout non riesce. Immagino che il problema sia legato al fatto che sto facendo riferimento a una variabile (myVar) che non rientra nell'ambito.
Qual è il modo migliore per risolverlo?
Soluzione
Questo è un candidato perfetto per chiusure:
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);
Il tuo problema è legato all'ambito e questo potrebbe aggirare il problema.
Altri suggerimenti
Ho avuto un problema simile. Il problema era che stavo provando a chiamare un metodo dall'interno attraverso un setTimeout (). Qualcosa del genere, CHE NON FUNZIONA PER ME:
function myObject() {
this.egoist = function() {
setTimeout( 'this.egoist()', 200 );
}
}
myObject001 = new myObject();
myObject001.egoist();
Il seguente ANCHE NON FUNZIONA:
... setTimeout( egoist, 200 );
... setTimeout( egoist(), 200 );
... setTimeout( this.egoist, 200 );
... setTimeout( this.egoist(), 200 );
... setTimeout( function() { this.egoist() }, 200 );
La soluzione era usare con l'istruzione () in questo modo:
function myObject() {
this.egoist = function() {
with (this) { setTimeout( function() { egoist() }, 200 );}
}
}
myObject001 = new myObject();
myObject001.egoist();
Naturalmente, questo è un ciclo infinito, ma il punto che sto sottolineando qui è diverso.
Spero che questo aiuti :)
Come buona pratica, prova a non usare le stringhe come parametri per setTimeout
e setInterval
perché invocherà eval
.. L'uso del seguente modulo potrebbe anche rendere più facile la comprensione / il debug di questo problema:
setInterval(function () {
// do stuff
// ...
// now wait 2 secs then call someFunction
setTimeout(someFunction, 2000);
}, 10000);
Eseguilo in Firefox e seleziona Strumenti | Console errori. se setTimeout fallisce, potrebbe dirti perché lì.
Prova anche a sostituire " someFunction (); "
con " alert ('hi') "
(senza punto e virgola) e vedi se funziona. In tal caso, il problema viene notevolmente ridotto.