Порядок выполнения JavaScript с помощью setTimeout () - PullRequest
10 голосов
/ 01 февраля 2011

Скажите, что у меня есть следующий код:

function testA {
   setTimeout('testB()', 1000);
   doLong();
}

function testB {
   doSomething();
}

function doLong() {
   //takes a few seconds to do something
}

Я выполняю testA(). Я читал, что Javascript является однопоточным. Что происходит через 1000 миллисекунд, когда достигается тайм-аут для testB()?

Некоторые возможные варианты:

  • testB() ставится в очередь для выполнения после doLong(), и все, что он вызвал, завершилось.
  • doLong() немедленно прекращается, а testB() запускается.
  • doLong() дается немного дольше для выполнения перед остановкой (либо автоматически, либо после запроса пользователя) и запускается testB().
  • doLong() приостановлено, testB() запущено. После того, как testB() закончится, doLong() возобновится.

Какой правильный ответ? Это зависит от реализации или является частью стандарта? *

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

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

Спасибо!

* Да, я знаю, что не все браузеры соответствуют стандартам: (

1 Ответ

10 голосов
/ 01 февраля 2011

Первое из ваших предположений правильное: testB() is queued up to execute after doLong() and anything else it called have finished.

Если для завершения testA требуется более одной секунды, testB просто придется подождать.

Кроме того, вы должны написать setTimeout(testB, 1000) вместо setTimeout('testB()', 1000).Отправка строки в setTimeout аналогична использованию eval, обычно считается злом и сделает вас врагами;)

...