js闭包变量回收问题

变量回收原则:

1.全局变量不会被回收

2.局部变量会被回收,也就是函数一旦运行完以后,函数内部的东西就会被销毁

3.只要被另外一个作用域所引用就不会被回收

例如

var i = 1;   // 全局变量不会被回收
var i = 2;   // 这里重复声明变量i,因此var声明被忽略,只是把i赋值为2
var add = function () {  // 全局变量不会被回收
  var i = 0;  // 局部变量
  return function () {
      i++;
      console.log(i); // 被另一个作用域引用导致不会被回收
  }
}();
add(); // 1

两个实例:

function a(){
  var b= 10;
  return function(){
    b++;
    console.log(b);
  }
}
a()(); //11
a()(); //11

分析:
在函数a中返回了一个匿名函数,在这个匿名函数中我们num++了一下,然后在函数外面执行了这个匿名函数函数,现在num是11,然后又执行了一次这个函数,你们应该是12吧,为什么不是呢?


原因:
js为了让没有必要的变量保存在内存中,(我们写的任何变量都是需要内存空间的)在不需要这个变量的时候它就会被销毁。所以每次执行一遍 a()() 则变量b就会被销毁。下次再执行,就会重新声明变量b,所以两次输出都是11。

function a(){
    var b = 0;
    return function(){
        b++;
        console.log(b);
    }
}
var d = a();
d();//1
d();//2

原因:

  • 函数a被变量b引用,确切的说是函数a里面的匿名函数被变量d所引用。
  • 因为变量d保存的是函数a执行完成后的值,而函数a执行完,返回了那个匿名函数,所以变量d等于匿名函数
  • 匿名函数因为使用了函数a中的变量b并且还被变量d引用,所以就形成了一个闭包。
  • 只要这个变量d不等于null的话,那么那个变量b会一直保存到变量d中不会被销毁
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值