2013-06-14 4 views
0

У меня есть функция, как это:Confused о Javascript таймаут

var a = function() { 
    setTimeout(function() { 
     alert(2); 
    }, 0); 
    alert(1); 
} 

a(); 

результат является предупреждение 1 первый, а затем оповещения 2

Но я думаю, что, хотя alert(2) находится в setTimeout, но он сразу же выполняет , Поскольку задержка равна 0

Почему именно alert(1) выполнен первым?

+0

См. Ответ Daniel Vandersluis http://stackoverflow.com/a/3580085/1317805 –

+0

'setTimeout' имеют минимальную задержку по умолчанию, вы не можете это сделать 0 – vikas

+0

Вы должны прочитать следующее: http: // ejohn. org/blog/how-javascript-timers-work/ –

ответ

1

setTimeout имеет задержку по умолчанию, которая приведет к ее выполнению после того, как выполнил alert(1).

1

Если вы не выполнили его немедленно, просто удалите setTimeout, вы получаете alert(1), потому что setTimeout имеет минимальное значение, см. here. Поэтому, когда вы устанавливаете значение 0, оно использует минимальное значение в зависимости от браузера.

0

Как указано в других случаях, setTimeout() имеет минимальный тайм-аут 4 мс.

Что еще более важно, даже если бы у него был реальный тайм-аут 0 мс, он тоже не срабатывал. Это потому, что Javascript является однопоточным (без учета веб-работников).

alert(2) пожары последние, потому что что-либо, установленное в setTimeout(), срабатывает только после выполнения текущего Javascript. Другими словами: действия setTimeout() помещаются в конец стека выполнения.

Таким образом, выполнение текущей функции завершается первым (выполняется alert(1)), и только после этого выполняется выполнение alert(2).

Это также является причиной того, что setTimeout только гарантирует, что код в нем выполняется после указанного времени, а не в точной времени.

См. http://ejohn.org/blog/how-javascript-timers-work/ для получения большого обзора.

+0

Может ли downvoter аннулировать его голос? Или укажите, что не так с ответом? Потому что я уверен, что он на 100% прав. –