Rozważmy taką pętlę:JavaScript zmienny wiązanie i pętla
for(var it = 0; it < 2; it++)
{
setTimeout(function() {
alert(it);
}, 1);
}
wyjście jest:
=> 2
=> 2
chciałbym go mieć: 0, 1. Widzę dwa sposoby, aby je naprawić:
Rozwiązanie # 1.
Ten oparty na fakcie, że możemy przekazać dane do setTimeout.
for(var it = 0; it < 2; it++)
{
setTimeout(function(data) {
alert(data);
}, 1, it);
}
Rozwiązanie nr 2.
function foo(data)
{
setTimeout(function() {
alert(data);
}, 1);
}
for(var it = 0; it < 2; it++)
{
foo(it);
}
Czy istnieją jakieś inne alternatywy?
+1. Możesz jednak nieco to zmienić, zmieniając podpis metody na: 'function (m) {/ * code * /}) (it);' – Alan
+1, ale czy ktoś może mi wyjaśnić, dlaczego to działa ?! –
@digorydoo Funkcja zadeklarowana w pętli jest zawijana w nawiasy, po których następuje zestaw nawiasów, które natychmiast wywołują funkcję. Ponieważ zmienne są ograniczone do funkcji, w której są zadeklarowane (lub zakres globalny, jeśli nie zostały zadeklarowane w ramach funkcji), wartość 'it' w każdej iteracji jest przypisana do zmiennej' m', która jest ograniczona do funkcji, która jest wykonywana natychmiast. –