Pętle i domknięcia

0
for (var i=1; i<=5; i++) {
    setTimeout( function timer(){
        console.log( i );
    }, i*1000 );
}

Natknąłem się na dosyć książkowy przykład i mam mały problem.

To co mi się wydaje, to:

  1. i jako drugi argument setTimeout normalnie się zmienia, ponieważ nie występuje tutaj domknięcie, czyli 1 - 2 - 3 itd.
  2. setTimeout zaczyna się wykonywać od razu w momencie dojścia do niego przy każdej iteracji pętli, czyli od tego momentu jest liczony czas,
    pętla wykonuję się prawie natychmiast, więc setTimeout'y prawie równolegle się rozpoczynają z czasaim 1000ms 2000ms 3000ms itd., przez co co jedna sek otrzymujemy 6 w konsoli.

Tylko dlaczego skoro funkcja startuje w momencie dojścia do niej to i nagle jest brane ze skończonej pętli. Czy to jest tak, że najpierw niby jest przejście przez pętle, delklaracje tego wyszstkiego wtedy i = 6 i dopiero później wszystkie setTimeouty startują na raz. Jak to jest, bo nie jestem w stanie tego pojąć. Wiem, że trochę pomieszałem, ale byłbym wdzięczny gdyby ktoś mi przedstawił wykonanie się tej pętli (albo chociaż 1 iteracji) tak jak to robi komputer.

@Edit

Chyba coś wymyśliłem. Poprawcie mnie, jezeli się mylę. Kod wcześniejszy można zapisać tak:

var i;
for (i=1; i<=5; i++) {
    setTimeout( function timer(){
        console.log( i );
    }, i*1000 );
}

I jest zmienną "globalną" przy takim założeniu. Po przejściu przez pętlę wynosi 6. Z tego wynika, że w pętli deklarujemy funkcję, a po skończonej pętli wszystko dopiero rusza, tak?

1

Funkcja nie jest startowana w momencie dojścia do niej. Jest zadeklarowana i przekazana jako parametr do funkcji setTimeout. Czyli przez pierwsze 10 ms wykonuje się cała pętla i po niej i=6. 990ms później pierwszy raz wykonuje się funkcja i wyświetla jej wartość, czyli 6.

0

Właśnie na to przed chwilą wpadłem. Dzięki za odpowiedź, mogę spać spokojnie :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.