for (var i = 0; i < 10; i++) {
setTimeout(function() {
alert(i);
}, 100);
}
Asked
Active
Viewed 7,322 times
2
-
потому что так написал автор примера. захотел бы 20 - написал бы 20 :) – Jul 16 '16 at 10:45
-
Я ничего не понимаю, фчём вопрос? – Doofy Jul 16 '16 at 10:50
-
Подозреваю в том, что автор ожидает увидеть 1, 2, 3, 4.. но надо почитать как работает анонимная функция. – xEdelweiss Jul 16 '16 at 11:27
1 Answers
2
Потому, что к моменту срабатывания setTimeout, цикл уже полностью выполнится и переменная примет значение равное десяти. А раз на момент вызова переменная уже равна десяти, то и на вывод пойдет десять.
Легкий пример происходящего:
a = 10;
setTimeout(function() {
console.log(a);
}, 1000);
a += 20; //выполнится раньше, чем вывод
Для решения, Вам надо убрать зависимость и создать локальное замыкание. Поскольку в JS область видимости у функций, Вам надо создать функцию и передать ей значение на текущий момент. Тогда оно будет скопировано, а не использовано как ссылка.
for(var i = 0; i < 10; i++){
(function(i) {
setTimeout(function(){
console.log(i);
}, 100);
})(i);
}
Alex Krass
- 17,744
-
Ещё, кстати, можно упомянуть, что для того чтобы задержка была равная между всему итерациями, нужно либо время задержки делать зависящим от
i, либо следующийsetTimeoutустанавливать по факту выполнения предыдущего. – Regent Jul 16 '16 at 11:39 -
@Regent, а есть какой-то простой способ сделать последовательное выполнение нескольких
setTimeout, что бы он работал как в глобальной области, так будучи выполненном внутри функции? Я просто что-то никак не догадаюсь, как это сделать без глобальных переменных. – Alex Krass Jul 16 '16 at 11:52 -
1Что-то я не понял фразы "работал как в глобальной области, так будучи выполненном внутри функции". Возможно, вы про такой вариант? – Regent Jul 16 '16 at 17:41
-