Ha a che fare con lo scoping di JavaScript. Si può aggirare facilmente con l'introduzione di un altro ambito con l'aggiunta di una funzione e avere quella funzione stessa chiamata e passare in i:
for (var i = 1; i <= some_number; i++) {
(function(j) {
$("#some_button" + j).click(function() {
alert(j);
});
})(i);
}
questo modo si crea una chiusura - quando la funzione interna ha accesso a un ambito che non esiste più quando viene chiamata la funzione. Vedere this article su MDC per ulteriori informazioni.
MODIFICA: RE: Funzioni di auto-chiamata: una funzione di auto-chiamata è una funzione che si chiama in modo anonimo. Non lo si istanzia e non lo si assegna a una variabile. Esso ha la seguente forma (notare le parentesi di apertura):
(function(args) {
// function body that might modify args
})(args_to_pass_in);
Relativamente questo alla domanda, il corpo della funzione anonima sarebbe:
$("#some_button" + j).click(function() {
alert(j);
});
Combinando questi insieme, si ottiene la risposta in il primo blocco di codice. La funzione di auto-chiamata anonima si aspetta un argomento chiamato j
. Cerca qualsiasi elemento con un id di some_button
con il valore intero di j
alla fine (ad esempio some_button1, some_button10). Ogni volta che si fa clic su uno di questi elementi, viene segnalato il valore di j
. La penultima riga della soluzione passa nel valore i
, che è il contatore di loop in cui viene chiamata la funzione di auto-chiamata anonima. Fatto un altro modo, potrebbe assomigliare a questo:
var innerFunction = function(j) {
$("#some_button" + j).click(function() {
alert(j);
});
};
for (var i = 1; i <= some_number; i++) {
innerFunction(i);
}
fonte
2010-06-30 14:07:33
È un problema molto comune come suggeriscono la maggior parte delle risposte. Inoltre, tutte le domande contrassegnate da 'javascript',' chiusure 'e 'cicli' punteranno a questo problema e soluzioni esatte - [javascript + chiusure + cicli] (http://stackoverflow.com/questions/tagged/javascript+closeures+ loop), incluso questo ora :) – Anurag
abbiamo bisogno di un modo per SO di avere un enorme pop-up che dice "QUESTO È STATO RISPOSTO PRIMA", con collegamenti alla domanda giusta. Ho visto almeno 3 versioni di JavaScript e 2 versioni di Python che fanno questa domanda. – Claudiu
@Claudiu: Sfortunatamente è molto difficile per i principianti JavaScript/Python cercare questi tipi di problemi. –