1. 为什么以下代码会打出6个6?
let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
个人理解:
因为当
setTimeout执行的时候,for循环已经完成,for循环完成时i的值为6,而且全局只有一个i,这个i只能循环6次。
思路大概是这样
for(i=0)—>for(i=1)—>for(i=2)—>for(i=3)—>for(i=4)—>for(i=5)—>for(i=6)—>console.log(6)—>console.log(6)—>console.log(6)—>console.log(6)—>console.log(6)—>console.log(6)—>执行完成
2. 写出让上面代码打印 0、1、2、3、4、5 的方法?
for(let i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
个人理解:
js并不是每次循环都将新值i覆盖旧值i,而是每一次循环都新创建了一个新的i,而新创建的i的作用范围只在for循环的两个括号内 ,所以6次循环所关联的闭包是6个不同的i。
3. 除了 for let 配合,还有什么其他方法可以打印出 0、1、2、3、4、5?
for(let i = 0; i<6; i++){
const x = i
setTimeout(()=>{
console.log(x)
})
}