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中不会被销毁

版权声明:本文为qq_25506089原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。