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

时间:2016-01-06 12:33:32

标签: javascript settimeout

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

请考虑以下代码:

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

for (var i = 0; i < 1000; i++) {
    foo(i);
}

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

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

2 个答案:

答案 0 :(得分:2)

  

是!!

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

for (var i = 1; i <= 1000; i++) {
    foo(i);
}

说明:

当你正在呼叫setTimeout它将独立执行无论setTimeout正在运行或将运行多少,所以它依赖于你调用的时间和你设置的时间。希望你得到这个。

答案 1 :(得分:0)

我知道很多人已经回答了这个问题。但是,大多数人并不确切知道事件循环是如何工作的。即使我最近得到它。所以,我认为这对所有接受这篇文章的人都有帮助。

setTimeout()函数根据事件回调和渲染队列工作。渲染队列是无法保证在完全超时后执行回调的原因。有像

这样的概念
  1. 调用堆栈,
  2. web apis和
  3. 回调队列
  4. 您有多次调用此函数,

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

    所以流程就像这样,每次调用foo(i)都会先调用堆栈。一旦调用堆栈到达其顶部(当循环结束时),web api(特定于浏览器)将逐个处理堆栈中的poped out函数,然后在超时时移动到回调队列。根据可用性,如果没有发生渲染,则执行回调。

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

    因此,订单有保证。

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

    Philip Roberts: What the heck is the event loop?