Comment résoudre Var hors de portée dans l'appel setTimeout
-
04-07-2019 - |
Question
J'essaie d'appeler un setTimeout à partir d'un rappel 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 fonctionne comme prévu, mais l'appel de setTimeout échoue. Je suppose que le problème est lié au fait que je référence une variable (myVar) qui n’est pas dans la portée.
Quelle est la meilleure façon de résoudre ce problème?
La solution
C'est un candidat idéal pour les fermetures:
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);
Votre problème est lié à la portée, ce qui éviterait cela.
Autres conseils
J'ai eu un problème similaire. Le problème était que j'essayais d'appeler une méthode à partir de lui-même via setTimeout (). Quelque chose comme ça, qui n'a pas fonctionné pour moi:
function myObject() {
this.egoist = function() {
setTimeout( 'this.egoist()', 200 );
}
}
myObject001 = new myObject();
myObject001.egoist();
Ce qui suit N'AUSSI PAS FONCTIONNÉ:
... setTimeout( egoist, 200 );
... setTimeout( egoist(), 200 );
... setTimeout( this.egoist, 200 );
... setTimeout( this.egoist(), 200 );
... setTimeout( function() { this.egoist() }, 200 );
La solution consistait à utiliser l'instruction with () comme suit:
function myObject() {
this.egoist = function() {
with (this) { setTimeout( function() { egoist() }, 200 );}
}
}
myObject001 = new myObject();
myObject001.egoist();
Bien sûr, le cycle est sans fin, mais ce que je veux dire ici est différent.
J'espère que cela vous aidera:)
Par souci de bonne pratique, essayez de ne pas utiliser de chaînes comme paramètres de setTimeout
et de setInterval
car cela invoquera eval
. Utiliser le formulaire suivant peut également rendre ce problème plus facile à comprendre / déboguer:
setInterval(function () {
// do stuff
// ...
// now wait 2 secs then call someFunction
setTimeout(someFunction, 2000);
}, 10000);
Lancez-le dans Firefox et cochez Outils | Console d'erreur. si setTimeout échoue, cela peut vous expliquer pourquoi.
Essayez également de remplacer "someFunction ();"
"par " alert ('hi') "
(sans point-virgule) et voyez si cela fonctionne. Si tel est le cas, le problème est considérablement réduit.