1 解释为什么如下代码会打印 6 个 6
let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}//输出:6个6
- let 声明一个变量i,并赋值为1
- 执行for语句,但因为setTimeout会加入宏队列,所以会在for语句执行结束后执行
- 变量i只有一个,且最终赋值为6,所以最后执行setTimeout打印出6个6
2 写出让上面代码打印 0、1、2、3、4、5 的方法
for(let i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}//0、1、2、3、4、5
ES6 为了解决上述问题,当for与let结合使用时,每次for循环就会在隐藏作用域内重新声明一个i ,那样的话,6 次循环,就会有 6 个不同的 i,console.log 出来的 i ,i的值遵循就近原则,当然是新声明的i。
除了使用 for let 配合,还有什么其他方法可以打印出 0、1、2、3、4、5
for (var i = 0; i < 5; i++) {
(function(i){ //立刻执行函数
setTimeout(function (){
console.log(i);
},0);
})(i);
}