2013-08-22 3 views
4

При запуске в браузере будет setTimeout когда-либо запускать его код до завершения основной программы? Согласны ли основные поставщики браузеров с этим поведением или это побочный эффект реализации? (или они согласились сохранить этот побочный эффект в качестве стандартного поведения)Браузер Javascript: setTimeout и основная программа

Рассмотрите очень простую (и бесполезную) программу.

setTimeout(function(){ 
    console.log("Timeout Called") 
},1); 
for(var i=0;i<10000000;i++){}; 
console.log("done"); 

Сначала мы установили единый микро-второй setTimeout функцию обратного вызова, который выводит Timeout Called на консоль.

Затем мы вращаемся в петле более чем на микросекунду.

Затем мы выводим done на консоль.

Когда я запускаю эту программу, она всегда выводит

done 
Timeout Called 

То есть setTimeout функции обратного вызова не рассматриваются, пока основная программа не закончится.

Является ли это надёжным, определенным поведением? Или бывают случаи, когда основное выполнение программы будет остановлено, запуск обратного вызова, а затем продолжение основной программы.

+1

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/EventLoop – zzzzBov

ответ

3

Да, это определено поведение. Это распространенное заблуждение, что Ajax обращается к неопределенному исполнению в течение некоторого времени, возможно, до завершения текущего пути выполнения, когда на самом деле они будут выполняться через некоторое время.

Javascript является одиночным и никогда не будет возвращаться к циклу событий, пока текущий поток не завершит выполнение полностью.

Асинхронная функция, такая как обработчик событий (включая Ajax) или функцию, которая запланирована с помощью setInterval/setTimeout, никогда не будет выполняться до завершения текущего пути выполнения.

+2

... запрет ошибок браузера. В Safari 5 некоторое время была ошибка, которая вызывала бы «загрузку» событий из вложенных iframe, и эти события * упреждали бы * запуск обработчиков событий. – Pointy

+0

@Pointy Я не знал об этой ошибке. Спасибо что подметил это. У вас есть ссылка, которую я могу добавить к моему ответу? – Paulpro

+1

Ну, я знаю только потому, что это вызвало очень странное поведение с помощью jQuery. Я посмотрю, смогу ли я найти старую ошибку, которую я зарегистрировал. Я не думаю, что это действительно стоит беспокоиться; в конце концов, когда Chrome получает обновление каждые 3 часа, все может случиться в любое время :) – Pointy

2

Это очень хорошо определено Поведение.

Браузер не асинхронном и до сих пор ждать предыдущего действия, чтобы завершить, прежде чем он делает следующее действие

1

При использовании timeOut, он будет ждать первый по количеству миллисекунд, что вы прошли, и то он будет продолжать ждать, пока в коде не будет открытия. Как правило, это означает, что он будет ждать, пока код не будет выполнен. Единственное исключение (вид) - это использование других timeOut s или setInterval s. Например, если ваш цикл был

for(var i=0;i<10000000;i++){ 
    setTimeout(function() { 
     console.log('One iteration'); 
    }, 15); 

}; 

Ваш выход будет

done 
Timeout Called 
One iteration 
One iteration 

И так далее.

Смежные вопросы