带有setTimeout()的Javascript执行顺序

带有setTimeout()的Javascript执行顺序,javascript,execution,multiple-browsers,Javascript,Execution,Multiple Browsers,假设我有以下代码: function testA { setTimeout('testB()', 1000); doLong(); } function testB { doSomething(); } function doLong() { //takes a few seconds to do something } 我执行testA()。我读过Javascript是单线程的。当达到testB()的超时时,1000毫秒后会发生什么 我能想到的一些可能性: te

假设我有以下代码:

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

function testB {
   doSomething();
}

function doLong() {
   //takes a few seconds to do something
}
我执行
testA()
。我读过Javascript是单线程的。当达到
testB()
的超时时,1000毫秒后会发生什么

我能想到的一些可能性:

  • testB()
  • doLong()
    立即终止,并启动
    testB()
  • doLong()
  • doLong()
    暂停,
    testB()
    启动。
    testB()
    完成后,
    doLong()
    继续
正确答案是什么?它是依赖于实施还是标准的一部分*

就我所知,这是相似但不相同的

如果您能推荐任何链接来更好地理解Javascript执行,我们将不胜感激

谢谢


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

您的第一个猜测是正确的:
testB()在doLong()和它调用的任何其他内容完成后排队执行。

如果
testA
完成所需时间超过1秒,
testB
只需等待


此外,您应该编写
setTimeout(testB,1000)
而不是
setTimeout('testB()',1000)
。向setTimeout发送字符串就像使用
eval
,会让您成为敌人;)

我开始相信
setTimeout(function(){testB();},1000)是最好的方法,我被误导了吗?@Shadow Wizard:是的,几乎被误导了。据我所知,你的方式和我的方式没有区别(当然,我的方式更短:D)。举例来说,假设我们将表达式拉入变量:
var f=function(){testB();};设置超时(f,1000)。仍然是相同的意思,但是现在你可以看到冗余了。谢谢你的回答和关于将函数传递给setTimeout而不是字符串的建议。看起来我一直在读的教程有点可疑;)与最新的chrome(版本62)一样,情况并非如此。首先执行testB(),然后执行doLong()。