闭包,其实就是一个作用域的问题。
var a=[]; for(var i=0;i<10;i++){ a[i]=function(){ console.log(i); } a[6](); //10
i=0时进行循环,a[0] = function(){ console.log(i) } ,这里的i不等于0,是因为函数只是被定义了,没有被调用,不会沿着作用域链向上查找i的值;
a[6]();//a[6] = function(){ console.log(i) } 函数调用时查找作用域链,此时的执行环境没有i,向上查找到全局变量i,i=10,输出
var a=[];
for(let i=0;i<10;i++){
a[i]=function(){
console.log(i);
};
}
a[6](); //6
调用时查找作用域链
a[6] = function (){
let i = 6;
a[6] = function{...}
}
此时 i=6 ,输出6
所以只要改变作用域,就能达到我们预期的效果。
var a=[];
for(var i=0;i<10;i++){
a[i]=(function(j){
return function(){
console.log(j)
}
})(i)
}a[6](); //6
定义a[6]时,
a[6] = function(6){
let j = 6;
return function(){
console.log(j)
}
}
调用a[6]() 查找作用域链,j=6
通过改变作用域来保存每一层循环的值