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

Zmienna Var i setTimeout

Object Storage Arubacloud
0 głosów
186 wizyt
pytanie zadane 7 marca 2023 w JavaScript przez jasper93 Obywatel (1,310 p.)

Witam, ostatnio czytałem o domknięciach  i natknąłem się na taki przypadek, którego nie rozumiem, szukałem trochę w necie, gdzie były wyjaśnienia, ale nadal tego do końca nie rozumiem, dlaczego poniżej przy wykorzystaniu zmiennej var, otrzymuje wynik 3, a przy let już: 0,1,2. Wiem, że zmienna var jest globalną i ma zasięg poza pętlą, natomiast nie rozumiem, skąd pojawia się nagle cyfra 3 i to trzy razy:

for(var i = 0; i < 3; i++){
  setTimeout(function(){
    console.log(i);
  }, 100);
}

 

1 odpowiedź

+1 głos
odpowiedź 7 marca 2023 przez tangarr Mędrzec (154,860 p.)
Jak sam napisałeś zmienna zdefiniowana przy pomocy var jest globalna. Twoja funkcja przekazana do timeouta przechwytuje tą zmienną a nie jej wartość. Po zakończeniu pętli zmienna i ma wartość 3.
komentarz 7 marca 2023 przez jasper93 Obywatel (1,310 p.)
Czyli mam rozumieć, że zmienna i na starcie do funkcji zostaje przekazana jako wartość 3?
komentarz 7 marca 2023 przez tangarr Mędrzec (154,860 p.)

Nie. Zmienna zostaje przekazana jako referencja a nie jako wartość. Możesz zmienić wartość zmiennej i a następne wywołania funkcji będą widziały nową wartość

for(var i = 0; i < 3; i++){
  setTimeout(function(){
    console.log(i);
    i = i * 2
  }, 100);
}

 

komentarz 7 marca 2023 przez jasper93 Obywatel (1,310 p.)
Teraz przed chwilą wyczytałem, ze najpierw wykonywana jest pętla ze względu na kolejkę zdarzeń, a dopiero wyświetlana wartość w setTimeOut co bardziej do mnie trafia skąd się bierze wartość "3". Nie wiem czy to prawda, to co wspomniałeś do referencji trochę jest dla mnie niezrozumiałe, bo jeszcze nie ruszałem obiektów.
1
komentarz 7 marca 2023 przez tangarr Mędrzec (154,860 p.)
Chodzi o to, że funkcja nie dostaje wartości 3 tylko widok na zmienną która cały czas jest w pamięci. Jeżeli będziesz w międzyczasie zmieniał wartość zmiennej i to za każdym wykonaniem twojej nienazwanej funkcji będziesz dostawał nową wartość.

Podobne pytania

0 głosów
2 odpowiedzi 687 wizyt
pytanie zadane 18 sierpnia 2021 w JavaScript przez adek236 Nowicjusz (180 p.)
+2 głosów
1 odpowiedź 96 wizyt
+1 głos
3 odpowiedzi 541 wizyt
pytanie zadane 26 kwietnia 2021 w JavaScript przez molik Użytkownik (950 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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!

...