使用setTimeout()的Javascript执行顺序

Bri*_*ett 10 javascript execution multiple-browsers

假设我有以下代码:

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

function testB {
   doSomething();
}

function doLong() {
   //takes a few seconds to do something
}
Run Code Online (Sandbox Code Playgroud)

我执行testA().我已经读过Javascript是单线程的.testB()达到超时后1000毫秒后会发生什么?

我能想到的一些可能性:

  • testB()排队等待执行后doLong(),它调用的任何其他内容都已完成.
  • doLong()立即终止并testB()启动.
  • doLong()在被停止之前(自动地或在提示用户之后)被执行并且testB()被启动的时间稍长.
  • doLong()暂停,testB()开始.后testB()已完成,doLong()重新开始.

什么是正确的答案?它是依赖于实现还是标准的一部分?*

就我所知,这个问题类似但不一样.

您可以推荐任何可以更好地理解Javascript执行的链接,我们将不胜感激.

谢谢!

*是的,我知道并非所有浏览器都遵循标准:(

Jak*_*kob 10

你猜测的第一个是正确的: 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,通常被视为邪恶并会让你成为敌人;)

  • @Shadow Wizard:是的,非常误导.据我所知,你的方式和我的方式没有区别(除了我的当然更短:D).为了说明,想象一下我们是否将表达式提取到变量中:`var f = function(){testB(); }; setTimeout(f,1000);`.仍然是相同的意思,但现在你可以看到冗余. (2认同)