Почему цикл с var выводит одинаковые значения

Будет выведено 3 три раза: все callbacks читают одну переменную после завершения цикла. Замените var на let, чтобы каждая итерация получила свою привязку.

Короткий ответ

Что ответить на собеседовании

Будет выведено 3 три раза: все callbacks читают одну переменную после завершения цикла. Замените var на let, чтобы каждая итерация получила свою привязку.

Подробный разбор

Ответ с пояснениями

Условие

Что выведет код и как получить 0, 1, 2?

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

Ответ

Будет выведено 3 три раза: все callbacks читают одну переменную после завершения цикла. Замените var на let, чтобы каждая итерация получила свою привязку.

Таймер не прерывает синхронный цикл. К моменту вызова callbacks проверка i < 3 уже завершилась с i === 3. Исправление: for (let i = 0; i < 3; i++). Если необходим var, передайте текущее значение параметром отдельной функции: ((value) => setTimeout(() => console.log(value), 0))(i). Это создаёт новую локальную переменную для каждого callback.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее