Fermeture de Javascript – valeur de liaison au lieu de référence

L'exemple ci-dessous a été tiré du livre, "Javascript: les bonnes parties". L'auteur dit que la fonction helper renvoie une fonction qui se lie à la valeur actuelle de var i .

Quelqu'un peut-il expliquer ce qui le contraint à lier la VALEUR au lieu de RÉFÉRENCE de var i , car la fonction helper est une fermeture pour add_the_handler fonction add_the_handler et devrait seulement voir la référence de var i :

 var add_the_handlers = function (nodes) { var helper = function (i) { return function (e) { alert(i); }; }; var i; for (i = 0; i < nodes.length; i += 1) { nodes[i].onclick = helper(i); } }; 

Si vous disiez:

 nodes[i].onclick = function(){ alert(i) }; 

La fonction n'aurait pas sa propre copie de i car i ne i pas déclaré dans la portée de la fonction.

Pour vous aider à mieux voir, j'ai modifié votre code ci-dessus:

 var add_the_handlers = function (nodes) { var helper = function(t) { // t is in the scope of "helper" return function(e){ // e is in the scope of this anonymous function // and is not used alert(t); }; }; // Variables declared here are in the scope of "add_the_handlers" var i; for (i = 0; i < nodes.length; i += 1) { nodes[i].onclick = helper(i); } }; 

Dans le «monde réel», vous verrez souvent un code comme celui ci-dessus raccourci pour ressembler à ceci:

 var add_the_handlers = function(nodes){ var i; for(i = 0; i < nodes.length; i++) nodes[i].onclick = (function(i){ return function(e){ alert(i); }; })(i); }; 

Vous passez la valeur actuelle de i dans la fonction helper . A l'intérieur de cette fonction, la variable i , un paramètre (confusément nommé) de la fonction, est différent de tout autre i . La fermeture retournée se lie donc à ce i particulier (vraiment [[scope]] qui contient que i , mais …).

Bon codage.

C'est une hypothèse: i est une primitive, il est toujours accessible par valeur, et non par référence.