J'ai récemment posé une question sur le comportement de jquery différée dans une boucle for. Link herejQuery comportement différé dans la boucle for
J'ai reçu une réponse de travail, mais je ne comprends pas pourquoi cela fonctionne.
Si je le code suivant:
function update(callbacks) {
return $.Deferred(function(dfr) {
setTimeout(function() {
callbacks.success()
}, 1000);
dfr.resolve();
}).promise();
}
function updateElements(deferreds) {
for (var i = 0; i < 5; i++) {
(function() {
var index = i;
deferreds.push(update({
success: function() {
alert(index);
}
}));
})();
}
};
(function() {
var deffereds = [];
updateElements(deffereds);
$.when.apply($, deffereds).then(function() {}, function() {});
})();
Il retourne 5 fenêtres d'alerte avec les valeurs 0 jusqu'à 4. Si je change la méthode updateElements à:
function updateElements(deferreds) {
for (var i = 0; i < 5; i++) {
var index = i;
deferreds.push(update({
success: function() {
alert(index);
}
}));
}
};
Il retourne 5 alerte les fenêtres avec la valeur 4 seulement. Quelqu'un pourrait-il expliquer ce comportement? J'ai du mal à comprendre d'où vient la différence.
Merci!
La boucle passe en quelques millisecondes, la mise à jour du nombre, et depuis différé est asynchrone et attend, au moment où il indique le nombre, la variable a changé et la boucle est terminée depuis longtemps. En l'enveloppant dans une fonction anonyme, la valeur de la variable 'index' est conservée et n'est pas mise à jour, car il s'agit d'une variable locale définie à chaque itération. – adeneo
duplication possible de [fermeture Javascript à l'intérieur des boucles - exemple pratique simple] (http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example) –