Выведется три раза значение 333. Почему: переменная `var i` имеет функциональную (не блочную) область видимости, цикл завершается и к моменту выполнения колбэков из очереди событий значение iii стало 333, поэтому все три вызова логируют это одно и то же число. Два способа получить последовательность 0,1,20,1,20,1,2: 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); } (Альтернативы: `setTimeout(console.log.bind(null, i), 0)` или передача аргумента в `setTimeout` — `setTimeout((x)=>console.log(x), 0, i)`.)
Два способа получить последовательность 0,1,20,1,20,1,2:
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);
}
(Альтернативы: `setTimeout(console.log.bind(null, i), 0)` или передача аргумента в `setTimeout` — `setTimeout((x)=>console.log(x), 0, i)`.)