给出以下示例:
for(var i=1;i<=5;i++){
setTimeout(function timer(){
console.log(i)
}, 0);
console.log(i);
}
打印出来:
1
2
3
4
5
6
6
6
6
6
setTimeout
不会立即执行,而是在循环结束后执行,尽管console.log
在循环内每次迭代都立即执行。
我对此做了一些研究,但是我能找到的大部分信息表明尽管setTimeout
中的匿名函数被添加到JavaScript执行的任务队列中,但它不一定立即被调用。
我的问题是浏览器如何确定哪些功能在执行方面具有优先权?
答案 0 :(得分:2)
获得此响应的原因是每次进入循环时都会设置新的超时。
超时被放入堆栈并在循环结束时执行。这可能会使您感到困惑,因为当您在同步代码中的函数内使用函数时,父级会暂停其执行,直到子项完成为止。但是当调用异步函数时(就像setTimeout()),行为是完全不同的。
查看此帖子:Asynchronous vs synchronous execution, what does it really mean?