闭包的一大功能就是保持变量在内存中不被回收。有这样的例子:
var a = function(){
var i = 0;
return function(){
++i;
}
}()
a();//1
a();//2
var b = function(){
var i = 0;
return ++i;
}
b();//1
b();//1
对于第一个, i 由于被闭包引用所以没被回收,这是可以理解的。但是,对于第二个例子,我们不用闭包的时候之所以i每次都为0是因为每次都运行了var i= 0,这跟回收没关系吧?那怎么理解“函数运行完后变量就被回收”这句话呢?我们定义一个全局变量:var grobal = 10; 它为什么没被回收?
全局变量声明之后,其生命周期会一直存在,直到全局被销毁(浏览器退出、系统关闭等)。函数声明之后,在每一次的运行时,系统会开辟一个新的内存区去运行函数,当函数执行完毕之后该区域会被回收,此为“函数运行完后变量就被回收”,实际上是运行函数的内存区被回收。