1. 奇怪的现象
let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
执行此代码时,得到的结果会是66666,而不是012345,原因是setTimeout是过一会再执行,所以for循环会先执行,当i=6时,跳出循环,此时setTimeout开始执行,可这个时候i的值已经为6了,所以执行6次打印,打印出来的结果也是6个6.
2. 打印012345的方法
for(let i = 0; i<6;i==){
setTimeout(()=>{
console.log(i)
},0)
}
使用let和for配合就可以打印出012345,原因是循环每次执行都会多创建一个i,复制当前i的值留在当前循环,不随i的值变化而变化,这个做法相当愚蠢,平白多创建了6个i。
3. 其他方法
for( var i = 0 ; i < 6 ; i++ ){
(function(j){
setTimeout( function(){
console.log( j )
},0 )
})(i)
}
使用立刻执行函数,也可以打出012345。这种方法不必为函数命名,避免了全局变量,而且立刻执行函数内部形成了单独的作用域。