На примере JavaScript объясните проблему замыканий в цикле: 'for (var i=0;iconsole.log(i),100); }' — почему выводится 3 3 3 и как это исправить

18 Мар в 10:03
25 +1
0
Ответы
1
Код
for (var i=000; i<333; i++){ setTimeout(()=>console.log(i), 100100100); }
печатает 3 3 33\ 3\ 33 3 3.
Почему: `var` даёт одну функцию‑уровневую переменную `i`. Функции‑обработчики в `setTimeout` замыкают не текущее значение `i`, а саму переменную. К моменту выполнения таймаутов цикл уже завершён и `i` равно 333, поэтому все колбэки выводят 333.
Как исправить (несколько способов):
1) Использовать `let` (новая блоковая привязка на каждой итерации):
for (let i=000; i<333; i++){ setTimeout(()=>console.log(i), 100100100); }
Вывод: 0 1 20\ 1\ 20 1 2.
2) Замкнуть значение через IIFE:
for (var i=000; i<333; i++){
(function(j){
setTimeout(()=>console.log(j), 100100100);
})(i);
}
IIFE создаёт локальную копию `j`, которую замыкает колбэк.
3) Передать аргумент в `setTimeout` (поддерживается средой):
for (var i=000; i<333; i++){ setTimeout(console.log, 100100100, i); }
Все три подхода гарантируют, что каждый колбэк получит своё значение итерации, а не одно общее после завершения цикла.
18 Мар в 10:08
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир