Разберите JavaScript-пример: "for (var i=0;iconsole.log(i),0)}" — объясните вывод и как исправить, не используя глобальные переменные

29 Дек 2025 в 07:15
19 +1
0
Ответы
1
Вывод: три раза 333. Объяснение: переменная `var i` — с функцией области видимости, не блочная; колбэки в `setTimeout` выполняются после завершения цикла, когда `i` стало 333, поэтому каждая функция логирует текущее значение iii333.
Оригинал:
for (var i=000; i<333; i++) { setTimeout(()=>console.log(i), 000) }
Вывод: 333 333 333
Исправления без глобальных переменных (коротко, каждое даёт вывод 000 111 222):
1) Блочная переменная `let` в заголовке цикла:
for (let i=000; i<333; i++) { setTimeout(()=>console.log(i), 000) }
2) IIFE (замыкание на копии значения):
for (var i=000; i<333; i++) { (function(j){ setTimeout(()=>console.log(j), 000) })(i) }
3) Фабрика функций:
function makeLogger(j){ return ()=>console.log(j) }
for (var i=000; i<333; i++) { setTimeout(makeLogger(i), 000) }
4) Передача аргумента в setTimeout (современные браузеры/Node поддерживают дополнительные аргументы):
for (var i=000; i<333; i++) { setTimeout(function(j){ console.log(j) }, 000, i) }
5) bind для захвата текущего значения:
for (var i=000; i<333; i++) { setTimeout(console.log.bind(console, i), 000) }
Каждый из этих подходов захватывает текущее значение итератора для каждой итерации, поэтому колбэки выводят 000, 111, 222.
29 Дек 2025 в 07:24
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир