Почему: var i имеет функциональную (не блочную) область видимости, поэтому все три колбека замыкают одну и ту же переменную i. К моменту, когда срабатывают таймауты (после ~(10) мс), цикл уже завершён и значение i стало (3), поэтому каждый console.log(i) печатает текущее значение — (3).
Как исправить (варианты):
Использовать блочную переменную: for (let i = 0; i < 3; i++) setTimeout(() => console.log(i), 10) — выведет (0,\,1,\,2).Закрыть текущее значение в замыкании: for (var i = 0; i < 3; i++) (function(x){ setTimeout(()=>console.log(x), 10); })(i);Передать аргумент в setTimeout (поддерживается во многих средах): for (var i = 0; i < 3; i++) setTimeout((x)=>console.log(x), 10, i);
Выведет три раза (3).
Почему: var i имеет функциональную (не блочную) область видимости, поэтому все три колбека замыкают одну и ту же переменную i. К моменту, когда срабатывают таймауты (после ~(10) мс), цикл уже завершён и значение i стало (3), поэтому каждый console.log(i) печатает текущее значение — (3).
Как исправить (варианты):
Использовать блочную переменную: for (let i = 0; i < 3; i++) setTimeout(() => console.log(i), 10) — выведет (0,\,1,\,2).Закрыть текущее значение в замыкании: for (var i = 0; i < 3; i++) (function(x){ setTimeout(()=>console.log(x), 10); })(i);Передать аргумент в setTimeout (поддерживается во многих средах): for (var i = 0; i < 3; i++) setTimeout((x)=>console.log(x), 10, i);