Sto leggendo un articolo (JavaScript Closures for Dummies) e uno degli esempi è il seguente.Come si fa riferimento alle variabili locali nelle chiusure?
function buildList(list) {
var result = [];
for (var i = 0; i < list.length; i++) {
var item = 'item' + list[i];
result.push(function() {alert(item + ' ' + list[i])});
}
return result;
}
function testList() {
var fnlist = buildList([1,2,3]);
// using j only to help prevent confusion - could use i
for (var j = 0; j < fnlist.length; j++) {
fnlist[j]();
}
}
testList();
Quando viene chiamata la lista di prova, una casella di avviso che dice "elemento3 non definito". L'articolo ha questa spiegazione:
Quando le funzioni anonime sono chiamate sulla linea
fnlist[j]();
tutti usano la stessa chiusura singola, e usano il valore corrente per i e articolo entro quella di chiusura (in cui i ha un valore di 3 perché il ciclo è stato completato, e l'articolo ha un valore di 'item3').
Perché l'articolo ha un valore di "articolo3"? Il ciclo for non termina quando divento 3? Se finisce, l'elemento non dovrebbe essere ancora 'item2'? O la voce variabile viene creata di nuovo quando testList chiama le funzioni?
è un bug che causa più testo del previsto? – CookieOfFortune