为什么setTimeout等待却需要0毫秒?

时间:2020-05-03 19:21:17

标签: javascript settimeout

setTimeout(function () {
console.log("m");
} , 0)
console.log('s');

为什么在setTimeout需要0毫秒等待的情况下在“ m”之前在“ m”之前打印此部分?

4 个答案:

答案 0 :(得分:1)

浏览器或node.js始终运行一个线程事件循环来运行您的代码。第一次运行时,它将始终运行您的同步代码,但也可能会查询异步事件,这些事件稍后会回调。这就是为什么我们在callback function处调用该函数的原因,稍后将对其进行调用。

setTimeout是一个微任务。

这意味着function您不会立即执行gona,它将首先排队,并将在下一个事件循环中执行。

还有一个事实:0 ms仅仅意味着它将最小等待0 ms而不是0

答案 1 :(得分:1)

创建诺言,调用异步函数或将超时设置为0毫秒时,该函数立即进入Javascript event loop队列。本质上,该函数被添加到要调用的函数队列中,并且一旦javascript解释器无事可做,它将开始调用这些函数。因此,当您将超时设置为0毫秒时,它将console.log("m")排入队列,然后调用console.log("s"),然后它无所事事,因此完成了排队的console.log("m"),这就是为什么乱七八糟。

答案 2 :(得分:0)

这仅仅是因为JS是单线程的,并且事件循环以这种方式工作。 setTimeout的编写方式将向您发送函数或您希望在回调队列中执行的任何操作。 然后前进到下一行,一旦执行了下一行,它将不会运行您的setTimeout部分,换句话说,直到堆栈不为空时,它才会处理setTimeout部分。

这是您的代码,它将像这样执行。

 setTimeout(function () {
    console.log("m");
 } , 0)
 console.log('s');
  1. 第一行将执行,它将setTimeout的内部发送到回调队列并移至第二行。
  2. 在第二行执行setTimeout部分时,将等待直到堆栈未完成并且在第二行完成执行后,
  3. setTimeout部分将执行,

也许用词令人困惑,让我们看看实际情况。我敢打赌,https://docs.google.com/spreadsheets/d/19-Jv2kDUXxMXUid1EqDmwceZXU3w6U2Nd5uqwr3Swes/edit#gid=0

解释了您无法获得一个比这个更好的例子来理解它的原因。

答案 3 :(得分:0)

因为JS代码一个接一个地排列。当您将setTimeout指定为0时,仍在等待,在C ++语言中,这将是这样的0.000000245ms,并且JS通常在C ++ / C浏览器上运行。

尝试这个简单的例子

for (let x = 0; x < 500; x++) {
  setTimeout(() => console.log(x), 0);
}
console.log('hello');