9

考虑以下示例:

<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 秒间隔执行?

感谢您的任何帮助,您可以提供!

石匠

4

3 回答 3

19
alertBox()

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

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

setInterval(alertBox, 5000);
于 2012-08-07T00:00:52.173 回答
11

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

function myFunction(){
    setTimeout(doSomething, 3000); // no () on the function
};
于 2012-08-07T00:00:43.317 回答
0

以下代码执行不同,

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

原因是(B)在执行时,javascript runtime中的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

于 2020-03-11T06:05:36.113 回答