以如下代码为例:
let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
这串代码的执行结果是6个6,而并非0,1,2,3,4,5
*谷歌浏览器将6个6直接缩写成了这种形式
之所以会出现这种情况,是因为setTimeout会使代码延迟执行。即执行完for循环后才进行输出,输出的结果就是循环结束时i的值。
而在for循环结束后,i的值就变成了6,又因为要输出六次,因此输出的结果是6个6。
但是以上代码通过简单的改动,就能获得完全不同的结果。
新的代码如下:
for(let i=0;i<6;i++){
setTimeout(()=>{
console.log(i)
},0)
}
这串代码仅仅只是把let声明从外部移到循环内部后,结果却大大不同。
由此可见,输出的结果是0,1,2,3,4,5
这是因为,在JS中,for和let一起使用的时候,每执行一次循环,就会多复制并创建一个i',这个i'值并不会跟随着循环的i值变化。即循环结束后会创建6个新的i',总计七个值(他们分别是0,1,2,3,4,5,6)。
除此之外还有其他办法能一次输出0-5
- 闭包
let i
for(i = 0; i<6; i++){
!function(j){
setTimeout(()=>{
console.log(j)
},0)
}(i)
}
- 利用const关键字
let i
for(i = 0; i<6; i++){
const x = i
setTimeout(()=>{
console.log(x)
})
}