Через примерно секунду число 10 будет выведено десять раз. Все callbacks обращаются к одной переменной var idx, которая к завершению цикла уже равна 10.
Что напечатает console.log в данном примере
Через примерно секунду число 10 будет выведено десять раз. Все callbacks обращаются к одной переменной var idx, которая к завершению цикла уже равна 10.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, какие числа появятся в выводе после выполнения следующего JavaScript‑кода:
for (var idx = 0; idx < 10; idx++) {
setTimeout(function () {
console.log(idx);
}, 1000);
}
Ответ
Через примерно секунду число 10 будет выведено десять раз. Все callbacks обращаются к одной переменной var idx, которая к завершению цикла уже равна 10.
setTimeout регистрирует отложенный вызов, но не останавливает цикл. К моменту выполнения первого callback цикл полностью завершён. Замыкания сохраняют доступ к переменной, а не копию её значения в момент создания.
Замените var на let, чтобы получить отдельную привязку для каждой итерации и вывод 0–9. В старом синтаксисе можно передать текущий idx аргументом таймера или замкнуть его через отдельный вызов функции. Задержка 1000 мс — минимальная, не обещание точного времени.