JavaScript setTimeout()不会等待执行吗?

11

考虑以下示例:

<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秒,并且只执行一次警报,而不是在预定的5秒间隔上执行?

感谢您能提供的任何帮助!

Mason


4
好的,回调立即被调用(并将结果传递给setTimeout)...应传递函数对象。 - user166390
1
这可能是SO上最常问的JavaScript问题。 - jfriend00
@jfriend00 我认为闭包变量在循环中可能会绑定它.. 😉 - user166390
1
我肯定感觉像个傻瓜 - 这就是我长时间不碰JS的下场 >.< - MasonWinsauer
@MasonWinsauer 我理解你的痛苦。 - twip
请参考我的评论,它可能对您有用。https://dev59.com/S2gt5IYBdhLWcg3wwwK-#60630117 - Nuwa
3个回答

21
alertBox()

这不像是一个立即执行函数吗?

试着传递这个函数(而不是执行它):

setInterval(alertBox, 5000);

14

之所以会出现这种情况,是因为你在执行函数而不是传递一个函数对象。

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

0

以下代码执行方式不同,

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

原因在于当(B)执行时,Javascript运行时的CallStack将setTimeout()推入WebAPI并等待0秒钟将回调函数推入事件队列,然后事件循环将在当前堆栈为空后将回调函数推入堆栈。
在情况(A)中,console.log()直接调用,因为它在WepAPI中,无需进行事件循环来执行。
更多参考: WebAPIs: 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接