Sto leggendo "Javascript: The Good Parts" e sono totalmente sconcertato da quello che sta succedendo qui. Una spiegazione più dettagliata e/o semplificata sarebbe molto apprezzata.Chiusure: spiegazione riga per riga dell'esempio "Javascript: parti buone"?
// 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 funzione add_the_handlers
aveva lo scopo di dare ad ogni gestore di un numero univoco (i). Esso non è riuscito perché le funzioni di gestione sono legati alla variabile i
, non il valore della variabile i
al momento è stata fatta la funzione:
// 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);
}
};
Ora, invece di assegnare una funzione a onclick, si definisce una funzione e invocarlo immediatamente, passando i
. Questa funzione restituirà una funzione di gestore eventi associata al valore di i
passato, non allo i
definito in add_the_handlers
. Quella funzione restituita è assegnata a onclick.
Vedi le domande Tagged in: http://stackoverflow.com/questions/tagged/javascript+closures+loops – CMS
È può anche giocare con una demo dal vivo http://jsbin.com/sezisalulede/1/edit?html,js,output –