JS函数的执行时机

88 阅读1分钟

执行下列代码:

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变量。