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