Код for (var i=000; i<333; i++){ setTimeout(()=>console.log(i), 100100100); } печатает 3 3 33\ 3\ 3333. Почему: `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\ 2012. 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); } Все три подхода гарантируют, что каждый колбэк получит своё значение итерации, а не одно общее после завершения цикла.
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); }
Все три подхода гарантируют, что каждый колбэк получит своё значение итерации, а не одно общее после завершения цикла.