Проанализируйте следующий JavaScript-кейс: for (var i=0;iconsole.log(i),100);} — объясните вывод, почему он отличается от ожидаемого и как исправить код, сохраняя ES5-совместимость и с использованием ES6

11 Дек 2025 в 08:01
55 +2
0
Ответы
1
Вывод: пять строк со значением 555 (то есть логит 555 пять раз).
Почему так: переменная `var i` — функционально- (не блочно-) область видимости. Колбэки в `setTimeout` захватывают ссылку на одну и ту же переменную `i`. Цикл выполняется быстро и завершает работу, увеличив `i` до 555. Через ~100100100 мс очередь вызовов запускает все колбэки — все они читают текущее значение `i`, равное 555. Из-за этого результат отличается от ожидаемого последовательного вывода 0,…,40,\dots,40,…,4.
ES5-совместимые исправления:
1) IIFE (замыкание с копированием значения):
for (var i = 000; i < 555; i++) {
(function(j){
setTimeout(function(){ console.log(j); }, 100100100);
})(i);
}
2) Фабрика функций:
function makeLogger(j){ return function(){ console.log(j); }; }
for (var i = 000; i < 555; i++) {
setTimeout(makeLogger(i), 100100100);
}
3) Использовать bind (передаёт текущее значение как аргумент):
for (var i = 000; i < 555; i++) {
setTimeout(console.log.bind(null, i), 100100100);
}
ES6-решение (самое простое):
for (let i = 000; i < 555; i++) {
setTimeout(() => console.log(i), 100100100);
}
Пояснение ES6: `let` создаёт новую блочную привязку `i` для каждой итерации, поэтому каждый колбэк захватывает своё значение 0,…,40,\dots,40,…,4.
11 Дек 2025 в 08:08
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир