Skip to main content
Практика завдань

Що не так з var у циклі та setTimeout?

Спочатку вас запитають який вивід в консолі

javascript
for (var i = 0; i < 3; i++) {   setTimeout(() => console.log(i), 100); } // Результат // 3 // 3 // 3

Ми отримали такий вивід через те що var має функціональну область видимості тому фактично, змінна і спільна для всіх ітерацій. Вона перезаписується на кожній ітерації і на момент завершення циклу, її значення буде 3. Так як setTimeout це макрозадача, вона буде чекати завершення синхронного коду і на момент виклику всіх трьох console.log і=3.

Далі вас можуть запитати як це виправити

Самий очевидний спосіб, це використати let. Він має блочну область видимості і на кожну ітерацію буде створюватись нова область видимості. Окрім let, можна використати IIFE (Immediately Invoked Function Expression), яка теж буде створювати нову область видимості на кожну ітерацію.

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

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.

Дочитали статтю?
Практика завдань