Вывод: три раза 333. Объяснение: переменная `var i` — с функцией области видимости, не блочная; колбэки в `setTimeout` выполняются после завершения цикла, когда `i` стало 333, поэтому каждая функция логирует текущее значение iii — 333. Оригинал: for (var i=000; i<333; i++) { setTimeout(()=>console.log(i), 000) } Вывод: 333333333 Исправления без глобальных переменных (коротко, каждое даёт вывод 000111222): 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.
Оригинал:
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.