Juste pour ajouter à ce que tout le monde a dit au sujet de setTimeout
: Si vous voulez appeler une fonction avec un paramètre dans le futur, vous devez mettre en place des appels de fonctions anonymes.
Vous devez passer la fonction comme argument pour qu'elle soit appelée plus tard. En fait, cela signifie qu'il ne faut pas mettre de parenthèses derrière le nom. L'exemple suivant appelle l'alerte en une seule fois et affiche "Hello world" :
var a = "world";
setTimeout(alert("Hello " + a), 2000);
Pour résoudre ce problème, vous pouvez soit mettre le nom d'une fonction (comme l'a fait Flubba), soit utiliser une fonction anonyme. Si vous devez passer un paramètre, alors vous devez utiliser une fonction anonyme.
var a = "world";
setTimeout(function(){alert("Hello " + a)}, 2000);
a = "Stack Overflow";
Mais si vous exécutez ce code, vous remarquerez qu'au bout de 2 secondes, la fenêtre contextuelle dira "Hello Stack Overflow". Cela est dû au fait que la valeur de la variable a a changé pendant ces deux secondes. Pour que la fenêtre contextuelle dise "Hello world" après deux secondes, vous devez utiliser l'extrait de code suivant :
function callback(a){
return function(){
alert("Hello " + a);
}
}
var a = "world";
setTimeout(callback(a), 2000);
a = "Stack Overflow";
Il attendra 2 secondes et affichera ensuite 'Hello world'.