本文参考了for循环 + setTimeout 结合一些示例
1 为什么如下代码会打印 6 个 6
let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
因为有setTimeout(),要等for循环执行完后(同步优先于异步优先于回调),这时五个 setTimeout 的回调全部塞入了事件队列中,i等于6,再执行console.log打印出i,所以打印出6个6。
2 如何让上面代码打印 0、1、2、3、4、5
for(let i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
let 为代码块的作用域,所以每一次 for 循环,console.log(i); 都引用到 for 代码块作用域下的i,因为这样被引用,所以 for 循环结束后,这些作用域在 setTimeout 未执行前都不会被释放。
3 除了使用 for let 配合,还有什么其他方法可以打印出 0、1、2、3、4、5,
for (var i = 0; i < 5; i++) {
(function(i){ //立刻执行函数
setTimeout(function (){
console.log(i);
},1000);
})(i);
}
人为给console.log(i);创造作用域,保存i的值,这里用到立刻执行函数。这样 console.log(i); 中的i就保存在每一次循环生成的立刻执行函数中的作用域里了。