【问题标题】:JavaScript setTimeout() won't wait to Execute? [duplicate]JavaScript setTimeout() 不会等待执行? [复制]
【发布时间】:2012-08-06 23:59:22
【问题描述】:

考虑以下示例:

<script type="text/javascript">
    function alertBox(){
        alert('Hello World!');
    }
    function doSomething(){
        setInterval(alertBox(), 5000); //This is for generic purposes only
    };
    function myFunction(){
        setTimeout(doSomething(),3000);
    };

    myFunction();
</script>

是什么导致它立即执行,而不是等待设置的3秒,以及只执行警报ONCE,而不是按计划的 5 秒间隔?

感谢您提供的任何帮助!

梅森

【问题讨论】:

  • 好吧,立即调用回调(并且结果被传递给setTimeout).. 改为传递函数对象。
  • 这可能是关于 SO 的最常见的 JavaScript 问题。
  • @jfriend00 我认为循环中的封闭变量可能会将其捆绑起来.. ;-)
  • 好吧,我确实觉得自己像个傻瓜——这就是我让 JS 呆了这么久的结果>.
  • @MasonWinsauer 感受你的痛苦。

标签: javascript callback settimeout setinterval


【解决方案1】:
alertBox()

这看起来不像是立即函数调用吗?

尝试传递函数(不执行它):

setInterval(alertBox, 5000);

【讨论】:

    【解决方案2】:

    这是因为您正在执行函数,而不是传递函数对象。

    function myFunction(){
        setTimeout(doSomething, 3000); // no () on the function
    };
    

    【讨论】:

      【解决方案3】:

      以下代码执行方式不同,

      setTimeout(console.log('Nuwan'),0)---(A); and 
      setTimeout(function(){console.log('Nuwan'),0}) --- (B)
      

      原因是当 (B) 执行时,JavaScript 运行时中的 CallStack 将 setTimeout() 推送到 Web API 和 WebAPI等待0秒将回调函数推送到事件队列,然后EventLoop在当前栈为空后将回调推送到栈中。

      情况(A)中,console.log()直接调用,因为在WepAPI中,不需要去事件循环执行。

      更多参考: WebAPI:https://developer.mozilla.org/en-US/docs/Web/API/Console_API Javascript 运行时和事件循环:https://cybrohosting.com/knowledgebase/17/How-JavaScript-works-in-browser-and-node.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-12
        • 1970-01-01
        • 2017-12-16
        • 1970-01-01
        相关资源
        最近更新 更多