【发布时间】:2019-01-02 02:30:38
【问题描述】:
Javascript、事件循环、setTimeout、IIFE、闭包
根据下面的参考资料,我对以下代码的理解是:
setTimeout() 是非阻塞的,由浏览器 Web API 处理,当计时器完成时,它会将回调放在回调队列中。然后事件循环等待调用堆栈空闲来依次运行每个回调。 setTimeout 闭包关闭匿名 IIFE,并且每次迭代都有正确的 index 值。
for(var i = 0; i < 3; i++){
(function(index){
setTimeout(function(){
console.log(index);
}, 5000);
})(i);
console.log("loop="+i);
}
/*Output in console is
loop=0
loop=1
loop=2
//after 5 seconds
0
1
2
*/
我正在寻找有关 Chrome 中以下代码发生了什么的解释。
for (var i = 0; i < 3; i++) {
setTimeout(
function(index) {
console.log(index);
}(i), 5000
);
console.log("loop="+i);
}
/* Output in console without any delay is:
0
loop=0
1
loop=1
2
loop=2
*/
为什么 'console.log(index)' 立即执行,没有 5 秒的延迟?
Web API 如何使用回调作为 IIFE 执行 setTimeout()?
回调队列中是否有任何回调?
事件循环是否将任何回调移动到调用堆栈?
或者是 setTimeout() 被忽略并且它的回调被立即在调用堆栈上执行?
我查阅过的参考资料:
Philip Roberts:事件循环到底是什么? | JSConf 欧盟 2014 https://www.youtube.com/watch?v=8aGhZQkoFbQ
Philip Roberts 帮助我陷入了事件循环 2016 https://www.youtube.com/watch?v=6MXRNXXgP_0
调用堆栈和事件循环 https://www.youtube.com/watch?v=mk0lu9MKBto
【问题讨论】:
-
附带说明,如果您想将参数传递给 setTimeout,您需要将它们放在延迟参数之后,例如setTimeout(function (index) { /* 做事 */ }, 5000, i);
标签: javascript closures settimeout iife