Будет напечатано три раза значение ......... — то есть последовательность ..., ..., ......,\ ...,\ ......,...,.... Коротко почему: переменная `var i` имеет функциональную область видимости. Цикл завершится, и к моменту срабатывания таймаутов `i` станет .......... Все три колбэка читают ту же переменную и выводят её текущее значение. Как исправить (несколько вариантов): 1) Современный и простой — использовать `let`: for (let i = 0; i console.log(i), 0); Это выведет ..., ..., ......,\ ...,\ ......,...,..., потому что `let` даёт новую привязку `i` для каждой итерации. 2) Для старых сред — замкнуть значение в IIFE: for (var i = 0; i < 3; i++) { (function(j) { setTimeout(() => console.log(j), 0); })(i); } Здесь в замыкании сохраняется текущее `j = i`, поэтому вывод будет ..., ..., ......,\ ...,\ ......,...,.... 3) Ещё варианты: - Использовать `bind`: for (var i = 0; i < 3; i++) setTimeout(console.log.bind(null, i), 0); - Передавать аргумент в `setTimeout` (поддерживается в средах): for (var i = 0; i console.log(j), 0, i); Любой из этих способов обеспечит вывод ..., ..., ......,\ ...,\ ......,...,....
Коротко почему: переменная `var i` имеет функциональную область видимости. Цикл завершится, и к моменту срабатывания таймаутов `i` станет .......... Все три колбэка читают ту же переменную и выводят её текущее значение.
Как исправить (несколько вариантов):
1) Современный и простой — использовать `let`:
for (let i = 0; i console.log(i), 0);
Это выведет ..., ..., ......,\ ...,\ ......, ..., ..., потому что `let` даёт новую привязку `i` для каждой итерации.
2) Для старых сред — замкнуть значение в IIFE:
for (var i = 0; i < 3; i++) {
(function(j) {
setTimeout(() => console.log(j), 0);
})(i);
}
Здесь в замыкании сохраняется текущее `j = i`, поэтому вывод будет ..., ..., ......,\ ...,\ ......, ..., ....
3) Ещё варианты:
- Использовать `bind`: for (var i = 0; i < 3; i++) setTimeout(console.log.bind(null, i), 0);
- Передавать аргумент в `setTimeout` (поддерживается в средах): for (var i = 0; i console.log(j), 0, i);
Любой из этих способов обеспечит вывод ..., ..., ......,\ ...,\ ......, ..., ....