【问题标题】:Javascript execution order with setTimeout()带有 setTimeout() 的 Javascript 执行顺序
【发布时间】:2011-06-19 03:56:03
【问题描述】:

假设我有以下代码:

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() 恢复。

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

据我所知,This question 相似但不相同。

您可以推荐任何链接以更好地理解 Javascript 执行。

谢谢!

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

【问题讨论】:

    标签: javascript execution multiple-browsers


    【解决方案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 发送字符串就像使用 evalgenerally considered evil 一样,会让你成为敌人;)

    【讨论】:

    • 我开始相信setTimeout(function() { testB(); }, 1000); 是最好的方法,我被误导了吗?
    • @Shadow Wizard:是的,被误导了。据我所知,你的方式和我的方式没有区别(当然我的方式更短:D)。为了说明,想象一下如果我们将您的表达式提取到一个变量中:var f = function() { testB(); }; setTimeout(f, 1000);。还是一样的意思,但是现在你可以看到冗余了。
    • 感谢您的回答和关于将函数传递给 setTimeout 而不是字符串的建议。看起来我一直在阅读的教程有点可疑;)
    • 与最新的 chrome(版本 62)一样,情况并非如此。 testB() 将首先执行,然后 doLong() 将被执行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多