变量回收原则:
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中不会被销毁