Witam.
Nie rozumiem pewnej rzeczy związanej z asynchronicznością i wykorzystaniem funkcji setTimeout. Z tego co się dowiedziałem funkcja ta pozwala na wykonanie pewnego kodu po określonym czasie. Dodatkowo jest to funkcja asynchroniczna, czyli, może być wykonywana poza głównym wątkiem, przykładowy kod:
console.log(1);
setTimeout(() => {
console.log(2);
}, 0)
console.log(3);
Skrypt wyświetli cyfry w kolejności 1, 3, 2, nawet mimo, że funkcja setTimeout drugi argument ma ustawiony na 0 milisekund, gdyż jest to funkcja asynchroniczna, czyli wykonywana poza głównym wątkiem.
Tylko do tej pory myślałem, że bez względu na to, co się będzie dziać w setTimeout, to nie będzie to blokowało działania strony. Zmodyfikowałem nieco powyższy skrypt:
console.log(1);
setTimeout(() => {
for(let i = 0; i < 3000000000; i++){
}
console.log(2);
}, 0)
console.log(3);
Następnie dodałem go do pliku .html w którym zrobiłem pole textarea, żeby móc coś tam wpisać i po uruchomieniu strony okazało się, że jednak strona się "zlagowała", nie mogłem nic wpisać w polu tekstowym i musiałem poczekać, aż skończy się pętla w setTimeout.
I nie potrafię tego zrozumieć, dlaczego strona się zacięła, skoro setTimeout jest niby funkcją asynchroniczną i podobno nie może zablokować strony, w sensie operacje w funkcjach asynchronicznych wykonują się w tle i taka jest idea, żeby nie blokowały działania strony. Ok, console.log(3) wykonało się przed setTimeout, jednak ta pętla miała "zasymulować" odczyt dużego pliku lub pobieranie danych z API (a właśnie taka operacja może podobno zaciąć stronę, gdyby cały kod był synchroniczny) i mimo że była w funkcji asynchronicznej, to i tak "zlagowała" stronę.
Czy może mi ktoś wytłumaczyć dlaczego tak się stało?