Cześć,
mam pytanie odnośnie domknięć. Czytam sobie YDKJS i nie pojmuję przykładu z setTimeout().
Książka pokazuje taki oto przykład kodu niedziałającego zgodnie z założeniem (chodzi o wyświetlanie aktualnej wartości i, inkrementowanej w pętli, po jednej sekundzie):
for (var i=1; i<=5; i++) {
setTimeout(function timer() {
console.log(i);
}, i*1000);
}
Działająca wersja powyższego wygląda tak:
for (var i = 1; i<=5; i++) {
(function() {
var j = i;
setTimeout(function timer(){
console.log(j);
}, j * 1000);
})();
}
rozumiem, że żeby napisać kod działający zgodnie z założeniami trzeba zrobić nowy zakres domknięcia dla każdej iteracji (bo i to zmienna globalna). Czyli zrobić nową zmienną i przypisać jej wartość i Pytanie: dlaczego tak się dzieje? Czym różni się zmienna j której przypisuje się wartość i od zmiennej i z zakresu globalnego? Innymi słowy dlaczego tak naprawdę potrzebujemy nowego zakresu domknięcia?
Kolejne pytanie: czy w przykładzie nr 2 tak naprawdę dochodzi do utworzenia 5 różnych zmiennych lokalnych? I jak to się dzieje, że przed wywołaniem setTimeout() j ma wartość 5, a potem już zaczyna od 1?