具有不同延迟的setTimeout()回调的JavaScript执行顺序



如果同时注册了多个回调,是否保证要调用的第一个回调是延迟最小的回调?

考虑以下代码:

function foo(i) {
    setTimeout(function () {
        console.log(i);
    }, i);
}
for (var i = 0; i < 1000; i++) {
    foo(i);
}

这个代码是否保证按顺序输出1-1000?


请注意:这个问题是关于使用相等延迟的而不是。已经确定,具有相等延迟的多个setTimeout()调用不能保证按顺序执行。

是的!!

function foo(i) {
    setTimeout(function () {
        console.log(i);
    }, i);
}
for (var i = 1; i <= 1000; i++) {
    foo(i);
}

说明:

当您调用setTimeout时,它将独立执行,无论setTimeout运行或将运行多少,因此它取决于您调用的时间和您设置的时间。希望你明白。

我知道很多人已经回答了这个问题。但是,大多数人并不清楚事件循环是如何工作的。就连我最近也得到了。所以,我认为这对所有到这个岗位的人都有帮助。

setTimeout()函数根据事件回调和呈现队列工作。呈现队列是不能保证回调在确切超时后执行的原因。有类似的概念

  1. 调用堆栈
  2. web api和
  3. 回调队列

下面这个函数被多次调用,

function foo(i) {
    setTimeout(function () {
        console.log(i);
    }, i);
}

因此流程类似于,每次对foo(i)的调用都将首先进入调用堆栈。一旦调用堆栈到达其顶部(当循环结束时),web api(特定于浏览器)将逐个处理堆栈中弹出的函数,然后在超时时移动到回调队列。根据可用性,如果不进行渲染,则执行回调。

在回调队列中,函数按调用顺序排列。

因此,订单是有保证的。

了解事件队列的更好地方是下面的文章。

菲利普·罗伯茨:事件循环到底是什么?

最新更新