Порядок выполнения Javascript с помощью setTimeout()

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

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

Первая из ваших догадок правильная: 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, обычно считается злом и сделает вас врагами;)