Замыкания... почему 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); } |
Keramet,
потому что у вас долгая реакция на кнопку ок, а у Google Chrome мания всё оптимизировать, так как он считает нужным. |
рони, т.е. на других броузерах alert выдаст всё по порядку?
|
Keramet,
да |
Keramet,
уберите for и всё будет по порядку везде и без замыканий :) |
Цитата:
|
Keramet,
одна функция с условием запуска без циклов |
Keramet,
var i = 0; (function fn() { i && alert(i); i++; i < 11 && setTimeout(fn, 3000); })(); |
Цитата:
. Почему нельзя просто alert(i); ? (чтобы ноль не выводить?) |
Keramet,
чтобы первый алерт был не сразу а через 3 секунды |
Цитата:
|
Цитата:
|
Цитата:
|
Асинхронное - я так понимаю, основанное на событиях, где нет четкого распорядка выполнения команд. но в нашем примере (10раз подряд вывести что-то, ключевое как раз и есть - подряд, по порядку). Было б логично и получить результат в нужном порядке )
|
Keramet,
таймаут -- это тоже событие. Ваши коллбеки выстреливают по этому событию. Просто в js дохрена подковерной возни и противоречивый синтаксис. |
Keramet,
Чтобы проще было это понять, представьте себе, что у нас есть объект таймаут Timeout.setTimeout(callback) //В объект таймаут записывется некий слот, скажем, onTimeout = callback // а где то на уровне реализации по событию таймаута движок вызывает этот коллбек onNextTick = function(){Timeout.onTimeout()} Вот так все реально и происходит, просто многое скрыто от ваших глаз, и это приводит к непоняткам. |
в примере с выводом 10, можно считать вывод числа 2 функцией обратного вызова (ФОВ) к выводу числа 1; вывод 3 - ФОВ от вывода 2 и т.д.?
|
Цитата:
|
Keramet,
Вы как бы говорите движку: Когда событие наступит вызови вот эти коллбеки. |
Возможно я не совсем корректно выразился:
что такое функция обратного вызова - это функция, которой передаётся управление только после того, как полностью закончит свою работу вызвавшая её функция. правильно? Я поэтому и спросил, можно ли считать (хотя бы образно), что вывод числа 2 (будем образно считать вывод числа 2 функцией обратного вызова) должен произойти только после того, как произойдет вывод числа 1 (а вывод числа 1 - это функция, по окончанию работы которой вызывается наша ФОВ). Вух - ни и заплёл я - надеюсь, смысл понятен ;) |
Цитата:
|
Keramet,
для хрома приоритет время -- время таймера подошло он пытается его сначала выполнить, затем смотрит очередь , если нельзя выполнить ставит в очередь, в других браузерах сразу кидают в очередь, потом пытаются выполнить. |
Цитата:
|
Цитата:
|
Цитата:
П.С. мне нравится ваше Скорее всего ;) |
Keramet,
Я не писал реализацию V8, извините. Но Вам это и не нужно знать. Просто имейте в виду, что порядок не гарантируется, этого достаточно. |
callbackhell,
Это я уже понял, что порядок не гарантируется :) в этом то и состоял вопрос - почему!! или я что-то накодил..., или глюк какой-то. Вариант Рони работает, но он мне как-то эстетически не нравиться - это моё субъективное мнение ;) |
Keramet,
так не используйте алерт и ваш вариант тоже сработает как надо если уложатся в 3 секунды все заботы браузера. |
Цитата:
|
Цитата:
|
Часовой пояс GMT +3, время: 11:15. |