为什么在其他行发生后的javascript调用中setTimeout函数时间为零秒?

时间:2016-12-01 06:35:10

标签: javascript node.js function asynchronous settimeout

我正在使用setTimeout函数: -

function myFunction() {
 alert("1"); // Called 1st


setTimeout(function(){ 
     alert("2");  // Called Third
}, 0000);

/*Same as setTimeout window.setTimeout(slowAlert, 0000);function slowAlert() { alert("That was Same as setTimeout!");}*/ 

     alert("39"); // Called Second
} 

即使我使用零秒,我也无法理解为什么警报(' 2')第三次来电

5 个答案:

答案 0 :(得分:1)

setTimeout()异步调用回调函数。因此,即使设置为零超时,也无法保证订单。

要使其同步,请移除setTimeout(),然后直接致电alert('2');

function myFunction() {
   alert("1"); // Called 1st
   alert("2");  // Called second
   alert("39"); // Called third
} 

<强>更新

如果您想确保订单保持不变,请在alert("39")内移动setTimeout()

function myFunction() {
   alert("1"); // Called 1st
   setTimeout(function() {
       alert("2");  // Called second
       alert("39"); // Called third
   }, 0);
}

答案 1 :(得分:1)

setTimeout会将您的回调添加到event loop,稍后当浏览器不忙时会调用该回调。第二个参数只是告诉浏览器何时您的回调添加到事件循环,而不是执行时。在你的情况下,它是零,所以回调几乎立即被添加(​​它实际上在大约4毫秒内)到循环,但它将在浏览器有时间后执行。代码中的其他警报不会使用setTimeout,因此会立即执行当前勾号,这就是回调前执行的原因。

答案 2 :(得分:0)

因为浏览器中的JS是单线程的,所以setTimeout会创建一个新的“堆栈”,在当前堆栈被清除后,即在当前函数完成之后执行n毫秒

答案 3 :(得分:0)

因为setTimeout是异步类函数。因为它打破了同步执行流程。但它并不像单独的线程那样同时执行。

setTimeout(function(){ 
     alert("2");  // Called Third
}, 0000);

上述代码在执行完所有其他语句后执行一次。

答案 4 :(得分:0)

好的,所以,让我们一次打勾,看看你的应用正在做什么:

  

勾选1 - 提醒(“1”);警报,现在更好地显示它!

     

Tick 2 - setTimeout(function(){},0000);超时为0秒?好的,我会的   等待

     

勾选3 - 提醒(“39”);另一个警报,显示!!

     

勾选4 - 警告(“2”);这是0秒,那次超时又是什么?