JavaScript setTimeout()赢了';你等不及执行了吗?

JavaScript setTimeout()赢了';你等不及执行了吗?,javascript,callback,settimeout,setinterval,Javascript,Callback,Settimeout,Setinterval,考虑以下示例: <script type="text/javascript"> function alertBox(){ alert('Hello World!'); } function doSomething(){ setInterval(alertBox(), 5000); //This is for generic purposes only }; function myFunction(){

考虑以下示例:

<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>

函数alertBox(){
警惕(“你好,世界!”);
}
函数doSomething(){
setInterval(alertBox(),5000);//这仅用于一般用途
};
函数myFunction(){
设置超时(doSomething(),3000);
};
myFunction();
是什么原因导致此警报立即执行,而不是等待设置的3秒,以及仅执行一次,而不是按计划的5秒间隔执行

谢谢你能提供的任何帮助


Mason

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

function myFunction(){
    setTimeout(doSomething, 3000); // no () on the function
};
这看起来不是一个即时函数调用吗

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


以下代码执行方式不同

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:
Javascript运行时和事件循环:

那么,回调会立即被调用(结果会传递给
setTimeout
)。。改为传递函数对象。这可能是最常被问到的javascript问题。@jfriend00我认为循环中的封闭变量可能会将它联系在一起…;-)好吧,我真的觉得自己像个傻瓜——这就是我让JS一个人呆这么久所得到的>@MasonWinsauer感受你的痛苦吧。
setInterval(alertBox, 5000);
setTimeout(console.log('Nuwan'),0)---(A); and 
setTimeout(function(){console.log('Nuwan'),0}) --- (B)