如果同时注册了多个回调,是否保证要调用的第一个回调是延迟最小的回调?
考虑以下代码:
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()
函数根据事件回调和呈现队列工作。呈现队列是不能保证回调在确切超时后执行的原因。有类似的概念
- 调用堆栈
- web api和
- 回调队列
下面这个函数被多次调用,
function foo(i) {
setTimeout(function () {
console.log(i);
}, i);
}
因此流程类似于,每次对foo(i)
的调用都将首先进入调用堆栈。一旦调用堆栈到达其顶部(当循环结束时),web api(特定于浏览器)将逐个处理堆栈中弹出的函数,然后在超时时移动到回调队列。根据可用性,如果不进行渲染,则执行回调。
在回调队列中,函数按调用顺序排列。
因此,订单是有保证的。
了解事件队列的更好地方是下面的文章。
菲利普·罗伯茨:事件循环到底是什么?