for循环添加的闭包问题

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

猜你喜欢

转载自www.cnblogs.com/jokes/p/9203856.html
今日推荐