执行下列代码:
let i ;
for(i = 0; i<5; i++){
setTimeout(()=>{
console.log(i)
},0)
} //5,5,5,5,5
我们发现,打印出的结果是5个5。为什么会是这样而不是0,1,2,3,4呢?
这与函数的执行时机有关。
setTimeout函数表示在执行函数之后一段时间后进行函数内的操作。这时,for循环已经运行完毕,全局变量i的值变为5,由于setTimeout函数被执行了5次,因此会打出5个5。
如果将变量i的声明放到for循环内部,结果会怎么样呢?
for(let i = 0; i<5; i++){ //将i变成局部变量
setTimeout(()=>{
console.log(i)
},0)
}
//0,1,2,3,4
此时,i变成局部变量,只在for循环内生效。这样循环每执行一次都会创建不同的i变量。