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