JS 函数的执行时机

112 阅读1分钟

先从一段代码讲起

let i = 0
for(i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}

相信初学JS的人都会比较疑惑上述代码的执行结果,最直观的想法会告诉我们这段代码会打印出(0、1、2、3、4、5),而结果其实是六个6。

这是因为for循环体内的变量i为全局变量,循环每执行一次都会给i自增1,最后i的值为6;而setTimeout()函数的执行时间实在循环执行之后,这就导致了每次打印的结果都指向了全局中的i,结果自然是打印出来六个6。再看下面的代码:

for(let i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}
//结果 0,1,2,3,4,5

ES6中新增了块级作用域的概念,每次循环的i值只在当次循环内有效,所以每次循环的变量i都是重新声明的,这样结果就是每次循环出递增的i值。