【问题标题】:Why setTimeout function in javascript calls after other line eventhough time is for zero seconds?即使时间为零秒,为什么在其他行之后调用 javascript 中的 setTimeout 函数?
【发布时间】:2016-12-01 06:35:09
【问题描述】:

我正在使用 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
} 

即使我使用零秒,我也无法理解为什么 alert('2') 第三次调用

【问题讨论】:

  • 因为setTimeout是异步函数。
  • 但是时间是零秒,所以 setTimeout 函数是否异步无关紧要,因为它不使用任何秒来执行该行代码
  • @VIKASKOHLI 这显然很重要,否则你不必问这个问题:)
  • @VIKASKOHLI,但是时间是零秒,所以 setTimeout 是否无关紧要 - see my answer。时间指定回调应该添加到事件循环的时间,而不是回调将被执行的时间。

标签: javascript node.js function asynchronous settimeout


【解决方案1】:

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

【讨论】:

  • 这意味着即使我们使用零秒,setTimeout 函数本身也需要一些时间
  • @VIKASKOHLI,我不明白你的意思。如果使用零秒,则意味着回调将立即添加到循环中,但稍后会在浏览器有时间时执行。您需要了解偶数循环的工作原理。
【解决方案2】:

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);
}

【讨论】:

  • 是否可以使用 setTimeout 函数第二次执行该代码,因为如果没有延迟,我想第二次运行该行代码
【解决方案3】:

由于浏览器中的 JS 是单线程的 setTimeout 创建了一个新的“堆栈”,在当前堆栈被清除后(即当前函数完成后)n 毫秒后执行

【讨论】:

    【解决方案4】:

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

    勾选 1 - alert("1");一个警报,现在最好显示它!

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

    Tick 3 - alert("39");另一个警报,显示!!

    Tick 4 - alert("2");已经 0 秒了,那个超时又是什么?

    【讨论】:

    • 它可以是 0 或 1 或任何其他正值。如果为零,则首先执行,否则不执行
    【解决方案5】:

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

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

    上面的代码在它之外的所有其他语句执行完之后执行一次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-28
      • 1970-01-01
      • 2019-04-23
      • 1970-01-01
      • 2018-09-26
      • 2016-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多