Je lis "Javascript: The Good Parts" et je suis totalement déconcerté par ce qui se passe vraiment ici. Une explication plus détaillée et/ou simplifiée serait grandement appréciée.Fermetures: explication ligne par ligne de l'exemple "Javascript: Good Parts"?
// BAD EXAMPLE
// Make a function that assigns event handler functions to an array of nodes the wrong way.
// When you click on a node, an alert box is supposed to display the ordinal of the node.
// But it always displays the number of nodes instead.
var add_the_handlers = function (nodes) {
var i;
for (i = 0; i < nodes.length; i += 1) {
nodes[i].onclick = function (e) {
alert(i);
}
}
};
// END BAD EXAMPLE
La fonction add_the_handlers
avait pour but de donner à chaque gestionnaire d'un numéro unique (i). Elle échoue parce que les fonctions de gestionnaire sont liés à la variable i
, pas la valeur de la i
variable au moment où la fonction a été faite:
// BETTER EXAMPLE
// Make a function that assigns event handler functions to an array of nodes the right way.
// When you click on a node, an alert box will display the ordinal of the node.
var add_the_handlers = function (nodes) {
var i;
for (i = 0; i < nodes.length; i += 1) {
nodes[i].onclick = function (i) {
return function (e) {
alert(i);
};
}(i);
}
};
Maintenant, au lieu d'attribuer une fonction à onclick, nous définissons une fonction et invoquez-le immédiatement, en passant à i
. Cette fonction renvoie une fonction de gestionnaire d'événements qui est liée à la valeur i
qui a été transmise, et non au i
défini dans add_the_handlers
. Cette fonction retournée est assignée à onclick.
voir les questions marquées dans: http://stackoverflow.com/questions/tagged/javascript+closures+loops – CMS
Vous peut également jouer avec une démo en direct http://jsbin.com/sezisalulede/1/edit?html,js,output –