Cóż, możesz zachować kontekst pętli for w pętli, ponieważ wszystko w kodzie jest w tym samym kontekście co funkcja zadeklarowana na początku.
Weźmy więc przykład Fritsa, ale najpierw zróbmy to w pełni JSLint szczęśliwe (minus funkcja wywołana w błędzie pętli).
/*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);
}
Należy pamiętać, że za każdym razem iteracyjne pętlę, jesteś redeclaring funkcja my_func
. To nie fajne! Dlaczego ponownie deklarować tę samą funkcję w kółko?
uznaniu jej wcześniej, tak:
/*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);
}
Sukces. Teraz nie tworzysz funkcji z każdą iteracją. I, jak JSLint pomaga uświadomić sobie, przesuwając wszystkie deklaracje var
na górę, nadal masz ten sam kontekst.
EDIT: W @Flame points out, nie trzeba zadeklarować funkcję wcześnie z jQuery each
i może wykorzystywać anonimową funkcję, ale nie jest to zły pomysł, aby zadeklarować wcześnie, zwłaszcza jeśli robisz do ponownego użycia logiki w wielu połączeniach each
. Głównym odbiorcą jest to, aby zrozumieć, że 1.) Praktyka wczesnej deklaracji nadal ma zalety, i 2.) jQuery nadal będzie wysyłać argumenty do twojej funkcji (tutaj, co nazywamy index
), chociaż JSLint będzie nie (i nie powinien) narzekać na anonimowe funkcje używane w each
s (jQuery sauce here).
Początkowo jest to trochę bardziej nieintuicyjne, jeśli przyzwyczaisz się do konstrukcji anonimowej $.each(function() {});
, ale jest to równie proste.
/*global alert, $ */
$("li").each(function(index) {
alert(index + ": " + $(this).text());
});
... zamienia się ...
/*global $, alert */
var fnOutside = function(index) {
alert(index + ": " + $(this).text());
};
$("li").each(fnOutside);
To może być mylące, ponieważ krótko wywołanie funkcji nie posiada parametrów, ale jQuery jest co pchanie „indeks” parametr do funkcji . Możesz po prostu chwycić kontekstową tablicę arguments
, aby zobaczyć, że nadal jest tam wciśnięta, jeśli chcesz opuścić nazwę.
Fiddle-ige
To znaczy, for
konstrukt nie tworzy nowego zamknięcia. To może cię martwić. To nie problem!
Pewnie, ale mimo to zmusza do zadawania dobrych pytań. Komentarz ruffin o tym, że funkcja jest redeclared w kółko, jest z pewnością przyczyną tej reguły, która w końcu ma sens. – y0uri