如果同时注册了多个回调,是否可以保证要调用的第一个回调是延迟最小的回调?
请考虑以下代码:
function foo(i) {
setTimeout(function () {
console.log(i);
}, i);
}
for (var i = 0; i < 1000; i++) {
foo(i);
}
此代码是否保证按顺序输出1-1000?
请注意:关于使用相等延迟,此问题不。已经确定,具有相同延迟的多个setTimeout()调用不保证按顺序执行。
答案 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()
函数根据事件回调和渲染队列工作。渲染队列是无法保证在完全超时后执行回调的原因。有像
您有多次调用此函数,
function foo(i) {
setTimeout(function () {
console.log(i);
}, i);
}
所以流程就像这样,每次调用foo(i)
都会先调用堆栈。一旦调用堆栈到达其顶部(当循环结束时),web api(特定于浏览器)将逐个处理堆栈中的poped out函数,然后在超时时移动到回调队列。根据可用性,如果没有发生渲染,则执行回调。
在回调队列中,函数按调用顺序排列。
因此,订单有保证。
了解事件队列的更好地方是以下文章。