javasicript 闭包及立即执行函数 拓展

function test(){
  var arr = [];
  for(var i=0;i<10;i++){
    arr[i] = function (){
      console.log(i + ' ');
    }
  }
  return arr;
}

var demo = test();

for(var i = 0;i<10;i++){
  demo[i]();
}

上面是一道经典的闭包问题。

以上打印结果是10,10,10,10,10,10,10,10,10,10;

理解过程:

test()执行的时候会产生:test的AO和GO;

arr[0]、arr[1]、arr[2]、arr[3]、arr[4]、arr[5]、arr[6]、arr[7]、arr[8]、arr[9]、i==10的时候退出for循环,此时的 i = 10;最后返回arr;

arr[0]、.......arr[9]都拥有同一个test的AO和GO;且AO中的 i = 10;

最后执行便是打印10 次 10。

解决方案:

function test(){
  var arr = [];
  for(var i=0;i<10;i++){
   (function (j){
    arr[j] = function (){
      console.log(j + ' ');
    }
   }(i))
  }
  return arr;
}

var demo = test();

for(var i = 0;i<10;i++){
  demo[i]();
}

在理解上面这个方法前,先看一下下面这个方法;

function test(){
  var arr = [];
  for(var i=0;i<10;i++){
   function a(j){
    arr[j] = function (){
      console.log(j + ' ');
    }
   }
   a(i);
  }
  return arr;
}

var demo = test();

for(var i = 0;i<10;i++){
  demo[i]();
}

立即执行函数被修改成了普通函数并执行,就更容易理解了;

执行test函数时:

  当 i == 0 时:执行a,  此时有a的A(其中 j = 0) ,test的AO和GO ,执行完成后a函数会被销毁,  然而a的AO依然存在arr[0]中;

当 i == 1 时:执行a,  此时有a的A(其中 j = 1) ,test的AO和GO ,执行完成后a函数会被销毁,  然而a的AO依然存在arr[1]中;

当 i == 2 时:执行a,  此时有a的A(其中 j = 2) ,test的AO和GO ,执行完成后a函数会被销毁,  然而a的AO依然存在arr[2]中;

.......

当 i == 9 时:执行a,  此时有a的A(其中 j = 9) ,test的AO和GO ,执行完成后a函数会被销毁,  然而a的AO依然存在arr[9]中;

最后被保存在arr中被返回到test函数外部;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天府之绝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值