Javascript: Utilisation de la contre-valeur courante en cours dans une fonction () {}?

Sur un site internet, je veux faire ceci: (simplifié)

myHandlers = new Array(); for(var i = 0; i < 7; i++) { myHandlers.push(new Handler({ handlerName: 'myHandler'+i, // works, eg ->myHandler1, 2, 3 etc. handlerFunc: function(bla) { /*...*/ alert(i); } // doesn't work,all return 7 } } 

Je pourrais configurer le compteur comme un autre attribut de mon gestionnaire (qui copierait la valeur actuelle) et l'utiliser dans ma fonction, mais je suppose, il existe également une façon de copier cette valeur, non?

Lorsque handlerFunc est appelé, i dans la fonction se réfère à i de la boucle for . Mais i n'ai probablement plus la même valeur.

Utilisez une fermeture pour lier la valeur actuelle de i dans la portée d'une fonction anonyme:

 handlerFunc: (function(i) { return function(bla) { /*...*/ alert(i); }; })(i) 

Ici, une fonction anonyme (function(i) { … })(i) est utilisée et appelée immédiatement. Cette fonction lie la valeur de i de la boucle for à i local. Je i alors indépendant du i de la boucle for .

 var myHandlers = new Array(); for (var i = 0; i < 7; i++) { myHandlers.push(new Handler({ handlerName: 'myHandler'+i, // works, eg ->myHandler1, 2, 3 etc. handlerFunc: (function(i) { return function(blah) { alert(i) } })(i) })) } 

Utilisez une fermeture pour lier le i afin que la valeur reste intacte

Dans votre exemple, i dans les fonctions est la même variable que i dehors des fonctions. Comme i été incrémenté en boucle, il est incrémenté dans les fonctions. En conséquence, si les fonctions sont appelées après la fin de la boucle, elles alerteront toutes "7".

Vous devez créer une nouvelle variable avec la portée appropriée et copier la valeur de i dans elle.

Une telle chose créerait l'effet souhaité.

 ... var pushHandler = function(i) { myHandlers.push(new Handler({ handlerName: 'myHandler'+i, // works, eg ->myHandler1, 2, 3 etc. handlerFunc: function(bla) { /*...*/ alert(i); } // doesn't work,all return 7 } } ... for(var i = 0; i < 7; i++) { pushHandler(i); } ...