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)
})
}