Одне з бородатих запитань, яке на даний час можна зустріти тільки на інтервʼю в так звані треш-галери. Найчастіше, питання поділяється на 2 частини:
Спочатку вас запитають який вивід в консолі
Ми отримали такий вивід через те що var має функціональну область видимості тому фактично, змінна і спільна для всіх ітерацій. Вона перезаписується на кожній ітерації і на момент завершення циклу, її значення буде 3. Так як setTimeout це макрозадача, вона буде чекати завершення синхронного коду і на момент виклику всіх трьох console.log і=3.
Далі вас можуть запитати як це виправити
Самий очевидний спосіб, це використати let. Він має блочну область видимості і на кожну ітерацію буде створюватись нова область видимості. Окрім let, можна використати IIFE (Immediately Invoked Function Expression), яка теж буде створювати нову область видимості на кожну ітерацію.