Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.12.2014, 22:19
Новичок на форуме
Отправить личное сообщение для freezecoder Посмотреть профиль Найти все сообщения от freezecoder
 
Регистрация: 09.12.2014
Сообщений: 1

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

Я понимаю, что таймаут срабатывает один раз, после завершения цикла, т.е. в анонимную функцию попадает i = 6, но почему тогда в консоль результат выводится 6 раз, если цикл уже закончен?
Ответить с цитированием
  #2 (permalink)  
Старый 09.12.2014, 22:31
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

freezecoder,
от 0 до включая 5 (<=) -> шесть итераций
Ответить с цитированием
  #3 (permalink)  
Старый 09.12.2014, 23:04
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

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

Последний раз редактировалось krutoy, 09.12.2014 в 23:06.
Ответить с цитированием
  #4 (permalink)  
Старый 09.12.2014, 23:20
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

Сообщение от freezecoder
что таймаут срабатывает один раз, после завершения цикла
И что значит один раз? Все брошенные таймауты срабатывают. Всего их шесть получается.
Ответить с цитированием
  #5 (permalink)  
Старый 10.12.2014, 09:42
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

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);

Последний раз редактировалось ruslan_mart, 10.12.2014 в 09:47.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
setTimeout в цикле Skoldin Общие вопросы Javascript 10 28.11.2013 16:16
popup окно в PHP цикле ryobi522 Общие вопросы Javascript 5 10.02.2012 02:18
Передача контекста через setTimeout decadent jQuery 3 10.02.2011 19:01
setTimeout как он работает??? namo86 Общие вопросы Javascript 16 02.02.2011 09:01
setTimeout в браузере IE и Opera leha66 Javascript под браузер 2 13.12.2010 13:02