function test(){
var arr = [];
for (var i=0;i<10;i++){
arr[i] = function(){
console.log(i);
}
}
return arr;
}
var myArr = test();
for (var i=0;i<myArr.length;i++){
myArr[i](); //结果为10个10
}
结果分析:
这是一个典型的闭包问题:
特点:arr[i] = function(){ console.log(i); } 中保存了i的引用,当myArr[i]()执行时,就要去寻找引用的上下文中的i
顺序:
函数提升和变量提升
1、GO
myArr:undefined;
test:function test(){};
i:0
2、test()执行
生成[[scope]]对象
[0]:test.AO{arr:[],i:10;}
注意:arr[i]和函数内的i是没有关系的;
[1]:GO
3、myArr[i]()执行的时候,test()已经执行完毕,会删除对执行上下文的引用,但是myArr[i]()没有删除对执行上下文的应用,还有每一次重新调用函数会重新生成一个执行上下文,和以前的执行上下文没有关系;
所以myArr[i]的所有的函数都指向一个执行上下文,也就指向同一个i;当test()执行完毕以后,i就已经变为10;所以当i=10 即10<10,条件不满足,所以停止;输出9个10