• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

setTimeout, pętle i domknięcia

Object Storage Arubacloud
+1 głos
1,104 wizyt
pytanie zadane 18 stycznia 2018 w JavaScript przez Artek Stary wyjadacz (11,800 p.)

Czytam książkę o JS i aktualnie przerabiam dział zatytułowany tak jak nazwa tego tematu.

Cytat z książki:

Najbardziej kanonicznym przykładem używanym do zilustrowania domknięcia jest zwykła pętla for.

No i taki kodzik :

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

Komentarz autora:

Standardowym oczekiwaniem względem powyżej przedstawionego fragmentu kodu jest wyświetlenie liczb 1,2...5 co sekundę. Jednak po wykonaniu omawianego kodu otrzymasz pięciokrotnie wyświetloną liczbę 6 w jednosekundowych odstępach 

Ja generalnie rozumiem o co chodzi. Rozumiem, że nie zostaje tutaj tworzona kopia zmiennej "i" przy każdej iteracji. Jednak zastanawia mnie czy mam rację wyczuwając tutaj asynchroniczność? Ja tłumaczę sobie to tak: pętla nie czeka na to aż setTimeout zakończy wykonywanie funcji timer po upływie 1000 milisekund tylko jakby inicjuje wykonywanie jej "w tle" i leci dalej. Czy poprawne jest określenie tego mianem asynchroniczności?

 

W dalszej części mamy autor pisze:

W rzeczywistości nawet gdyby zdefiniować setTimeout(..,0) dla każdej iteracji, wszystkie wywołania zwrotne będą wykonane tuż po zakończeniu działania pętli.

I tego nie rozumiem. Czy to oznacza, że setTimeout z natury zachowuje się w ten sposób, że gdy jest odpalony w pętli to funkcje zwrotne są wywoływane po jej zakończeniu? Czy może jeszcze inaczej? 

3 odpowiedzi

+3 głosów
odpowiedź 18 stycznia 2018 przez niezalogowany

Ja tłumaczę sobie to tak: pętla nie czeka na to aż setTimeout zakończy wykonywanie funcji timer po upływie 1000 milisekund tylko jakby inicjuje wykonywanie jej "w tle" i leci dalej. Czy poprawne jest określenie tego mianem asynchroniczności?

Tak

I tego nie rozumiem. Czy to oznacza, że setTimeout z natury zachowuje się w ten sposób, że gdy jest odpalony w pętli to funkcje zwrotne są wywoływane po jej zakończeniu? Czy może jeszcze inaczej? 

Zasadniczo samo wystąpienie pętli nie ma tutaj nic do rzeczy. Kluczowym elementem do zrozumienia setTimeout 0 jest zapoznanie się z event loop.

Najprościej rzecz ujmując, setTimeout 0 wyrzuca kod z kolejki

komentarz 18 stycznia 2018 przez pablop76 VIP (123,180 p.)
+2 głosów
odpowiedź 18 stycznia 2018 przez kap Stary wyjadacz (11,620 p.)

Funkcja przekazana do `setTimeout` wykonuje się asynchronicznie zawsze - nie zależy to od tego czy jest w pętli czy nie,
asynchroniczny kod wykonuje się dopiero po wykonaniu kodu synchronicznego, najprostszy przykład:
 

console.log('foo')
setTimeout(console.log, 0, 'bar')
console.log('baz')


Wynik: 
foo
baz
bar

Polecam klasyk: https://www.youtube.com/watch?v=8aGhZQkoFbQ

+1 głos
odpowiedź 18 stycznia 2018 przez Artek Stary wyjadacz (11,800 p.)

Bardzo dziękuję za odpowiedzi. Były naprawdę przydatne - czuję się mądrzejszy teraz wink Oczywiście upvote'y już poszły.

Podobne pytania

0 głosów
1 odpowiedź 2,695 wizyt
pytanie zadane 17 stycznia 2017 w JavaScript przez mowmiheniek Stary wyjadacz (11,900 p.)
0 głosów
2 odpowiedzi 682 wizyt
pytanie zadane 18 sierpnia 2021 w JavaScript przez adek236 Nowicjusz (180 p.)
+1 głos
3 odpowiedzi 535 wizyt
pytanie zadane 26 kwietnia 2021 w JavaScript przez molik Użytkownik (950 p.)

92,570 zapytań

141,422 odpowiedzi

319,644 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...