Число 6 будет выведено пять раз. Все callbacks захватывают одну переменную var index, которая к моменту выполнения таймеров уже получила значение 6.
Эффект var и отложенного вызова в цикле
Число 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.