Bene, è possibile mantenere il contesto del for nel proprio ciclo, poiché tutto ciò che è in for è in realtà nello stesso contesto di una funzione dichiarata all'inizio.
Quindi prendiamo l'esempio di Frits, ma prima rendiamo questo completamente soddisfatto da JSLint (meno la funzione chiamata nell'errore di ciclo).
/*global console*/
var my_func, i, list;
for (i = 0; i < list.length; i+= 1) {
my_func = function (i) {
console.log(i);
};
my_func(i);
}
noti che ogni volta eseguire iterazioni del ciclo, sei redeclaring la funzione my_func
. Questo non e buono! Perché ri-dichiarare la stessa funzione più e più volte?
dichiararlo in precedenza, in questo modo:
/*global console*/
var my_func, i, list;
my_func = function (i) {
console.log(i);
};
for (i = 0; i < list.length; i+= 1) {
my_func(i);
}
successo. Ora non si crea una funzione con ogni iterazione. E, come JSLint ti aiuta a realizzare spingendo tutte le tue dichiarazioni var
in cima, puoi comunque avere lo stesso contesto.
EDIT: Come @Flame points out, non c'è bisogno di dichiarare la funzione presto con jQuery each
e possibile utilizzare una funzione anonima, ma non è una cattiva idea di dichiarare in anticipo, soprattutto se si sta facendo riutilizzare la logica in più chiamate each
. I principali take-homes sono capire che 1.) La pratica della dichiarazione anticipata ha ancora vantaggi, e 2.) jQuery invierà ancora argomenti alla tua funzione (qui, ciò che chiamiamo index
), sebbene JSLint non sia (e non dovrebbe) lamentarsi delle funzioni anonime utilizzate in each
s (jQuery sauce here).
Inizialmente è un po 'meno intuitivo se si è abituati al costrutto anonimo $.each(function() {});
, ma è altrettanto semplice.
/*global alert, $ */
$("li").each(function(index) {
alert(index + ": " + $(this).text());
});
... si trasforma in ...
/*global $, alert */
var fnOutside = function(index) {
alert(index + ": " + $(this).text());
};
$("li").each(fnOutside);
che potrebbero essere brevemente confusione perché la chiamata di funzione non ha parametri, ma jQuery è ciò che sta spingendo il "indice" parametro alla funzione . Potresti semplicemente prendere l'array contestuale arguments
per vedere che è ancora inserito lì se vuoi lasciare il naming out.
Fiddle-ige
Vale a dire, il costrutto for
non crea una nuova chiusura. Questo potrebbe preoccuparti. Non è un problema!
Certo, ma ancora .. Ci costringe a fare buone domande. Il commento di ruffin sul funzionamento ripetuto più volte è chiaramente la ragione di questa regola che ha finalmente un senso. – y0uri