Эффект var и отложенного вызова в цикле

Число 6 будет выведено пять раз. Все callbacks захватывают одну переменную var index, которая к моменту выполнения таймеров уже получила значение 6.

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

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

Число 6 будет выведено пять раз. Все callbacks захватывают одну переменную var index, которая к моменту выполнения таймеров уже получила значение 6.

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

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

Условие

Определите, какой результат будет напечатан в консоль после выполнения данного фрагмента кода, учитывая особенности области видимости переменной, объявленной через var, и асинхронность функции setTimeout.

for (var index = 1; index <= 5; index++) {
  setTimeout(function() {
    console.log(index);
  }, 0);
}

Ответ

Число 6 будет выведено пять раз. Все callbacks захватывают одну переменную var index, которая к моменту выполнения таймеров уже получила значение 6.

Цикл регистрирует пять таймеров для значений от 1 до 5, но не запускает их внутри своей синхронной части. После последнего инкремента условие index <= 5 становится ложным. Для вывода 1, 2, 3, 4, 5 замените var на let: у каждой итерации появится отдельное связывание. Другой вариант — передать index аргументом setTimeout и принять его параметром callback.

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

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

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

Подробнее