Вывод: в консоль пять раз напечатается число 555. Почему: переменная `var i` общая для всех замыканий; к моменту выполнения таймаутов цикл уже завершён и i=5i=5i=5, поэтому все колбэки читают одно и то же значение. Два способа исправить (чтобы вывести 0…40\ldots40…4): 1) Использовать блочную переменную `let` (каждая итерация получает своё `i`): for (let i = 000; i < 555; i++) { setTimeout(function(){ console.log(i); }, 100100100); } 2) Создать замыкание, захватив текущее значение через IIFE: for (var i = 000; i < 555; i++) { (function(j){ setTimeout(function(){ console.log(j); }, 100100100); })(i); } Дополнительно: можно также использовать привязку аргумента в `setTimeout` (в современных средах) или `Function.prototype.bind`: - setTimeout(function(j){ console.log(j); }, 100100100, i); - setTimeout(console.log.bind(null, i), 100100100);
Два способа исправить (чтобы вывести 0…40\ldots40…4):
1) Использовать блочную переменную `let` (каждая итерация получает своё `i`):
for (let i = 000; i < 555; i++) {
setTimeout(function(){ console.log(i); }, 100100100);
}
2) Создать замыкание, захватив текущее значение через IIFE:
for (var i = 000; i < 555; i++) {
(function(j){
setTimeout(function(){ console.log(j); }, 100100100);
})(i);
}
Дополнительно: можно также использовать привязку аргумента в `setTimeout` (в современных средах) или `Function.prototype.bind`:
- setTimeout(function(j){ console.log(j); }, 100100100, i);
- setTimeout(console.log.bind(null, i), 100100100);