先从一段代码讲起
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值。