带有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()
*是的,我知道并非所有浏览器都遵循标准:(您的第一个猜测是正确的:
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()。