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.