https://www.imooc.com/video/16699 视频地址
- 使用ES5的情况
var callbacks=[]
for(var i=0; i<=2; i++){
callbacks[i]=function(){
return i*2
}
}
console.log([
callbacks[0](),
callbacks[1](),
callbacks[2](),
])
由于var声明的i是局部作用域的原因,这段声明语句会被变量提前,也就是i的声明会提前到for 循环的前面,所以下面调用callbacks的时候,i都是变成了3才开始进入循环,得到的结果就是6,6,6。
- 使用ES6的情况
var callbacks2=[]
for(let j=0; j<=2; j++){
callbacks[j]=function(){
return j*2
}
}
console.log([
callbacks2[0](),
callbacks2[1](),
callbacks2[2](),
])
用es6的let声明块级变量就能解决这个闭包的问题,也就是将j变量声明在了for循环内,得到的结果就是0,2,4。