Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Замыкания... почему alert "глючит" ? (https://javascript.ru/forum/misc/60475-zamykaniya-pochemu-alert-glyuchit.html)

Keramet 02.01.2016 17:30

Замыкания... почему alert "глючит" ?
 
Есть 2 фрагмента, каждый из которых через 3 секунды выводит i (от 1 до 10). Но вот почему-то во втором (с alert) порядок нарушен. console.log выводит всё правильно (от 1 до 10.) Почему?
1.
for (var i = 1; i <= 10; i++) {
		(function(e) {
			setTimeout(function() {
				console.log(e);
			}, 3000);
		})(i);
	}


2.
for (var i = 1; i <= 10; i++) {
		(function(e) {
			setTimeout(function() {
				alert(e);
			}, 3000);
		})(i);
	}

рони 02.01.2016 17:45

Keramet,
потому что у вас долгая реакция на кнопку ок, а у Google Chrome мания всё оптимизировать, так как он считает нужным.

Keramet 02.01.2016 17:51

рони, т.е. на других броузерах alert выдаст всё по порядку?

рони 02.01.2016 17:53

Keramet,
да

рони 02.01.2016 18:02

Keramet,
уберите for и всё будет по порядку везде и без замыканий :)

Keramet 02.01.2016 18:35

Цитата:

Сообщение от рони (Сообщение 402249)
Keramet,
уберите for и всё будет по порядку везде и без замыканий :)

т.е. другой цикл использовать?

рони 02.01.2016 18:42

Keramet,
одна функция с условием запуска без циклов

рони 02.01.2016 18:53

Keramet,
var i = 0;
		(function fn() {
		  i  &&  alert(i);
          i++;
		  i < 11 &&	setTimeout(fn, 3000);
		})();

Keramet 02.01.2016 19:21

Цитата:

Сообщение от рони (Сообщение 402253)
Keramet,
var i = 0;
		(function fn() {
		  i  &&  alert(i);
          i++;
		  i < 11 &&	setTimeout(fn, 3000);
		})();

Интересное решение. А зачем в строке 3 i && alert(i);
. Почему нельзя просто alert(i); ? (чтобы ноль не выводить?)

рони 02.01.2016 19:41

Keramet,
чтобы первый алерт был не сразу а через 3 секунды


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