Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   setTimeout в цикле (https://javascript.ru/forum/misc/52244-settimeout-v-cikle.html)

freezecoder 09.12.2014 22:19

setTimeout в цикле
 
Привет, народ.
Поясните такое поведение, вот есть код
for(var i = 0; i <= 5; i++) {
	setTimeout(function() {
		console.log(i);
	}, 500);
}

Я понимаю, что таймаут срабатывает один раз, после завершения цикла, т.е. в анонимную функцию попадает i = 6, но почему тогда в консоль результат выводится 6 раз, если цикл уже закончен?

Deff 09.12.2014 22:31

freezecoder,
от 0 до включая 5 (<=) -> шесть итераций

krutoy 09.12.2014 23:04

потому что на каждой итерации в очередь бросается вызов. когда приходит очередь каждого вызова, они отрабатывают в существующем окружении, где i=6

krutoy 09.12.2014 23:20

Цитата:

Сообщение от freezecoder
что таймаут срабатывает один раз, после завершения цикла

И что значит один раз? Все брошенные таймауты срабатывают. Всего их шесть получается.

ruslan_mart 10.12.2014 09:42

for(var i = 0; i < 5; i++) {
	(function(i) {
		setTimeout(function() {
			console.log(i);
		}, 500);
	})(i);
}


Если же Вам нужно, что таймауты срабатывали по очереди, то никакой цикл не нужен:

var i = 0;
setTimeout(function() {
    alert(i);
    if(++i < 5) setTimeout(arguments.callee, 500);
}, 500);


Часовой пояс GMT +3, время: 22:55.