什么是闭包
闭包就是能够访问另一个函数作用域中变量的函数。我们知道,函数作用域是独立的、封闭的,外部的执行环境是访问不了的,但是闭包可以。例子如下:
//无法访问到局部变量
function f1(){
var n=999;
}
alert(n); // error
如何从外部获取局部变量呢?
我们只要在f1函数的内部,再定义一个函数f2,把f2作为返回值,我们就可以在f1外部读取它的内部变量。如下:
function f1(){
var n=999;
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
上述代码的f2函数,就是闭包。
闭包的原理
闭包的实现原理,其实是利用了作用域链的特性,我们知道作用域链就是在当前执行环境下访问某个变量时,如果不存在则一直向外层寻找,最终找到最外层也就是全局作用域,这样就形成了一个链条。
闭包的作用
1.可以读取函数内部的变量。
2.把变量保持在内存中。
为什么会说变量保留在内存中?,我们来看以下代码:
function f1(){
var n=999;
nAdd=function(){n+=1}
function f2(){
alert(n);
}
return f2;
}
var result=f1();//这里的result相当于f2
result(); // 999
nAdd();
result(); // 1000
上述代码运行了两次,第一次的值为999,第二次的值为1000,这也说明了函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。
闭包的缺点
1.由于闭包会使得函数中的变量都保存在内存中,内存消耗大,所以不能滥用闭包,否则会造成网页性能问题
,在IE中可能会导致内存泄漏。解决的方法是,在函数退出之前,将不适用的局部变量全部删除。
2.对闭包使用不当会导致变量不会被垃圾回收机制回收,造成内存泄漏。
为什么使用闭包时变量不会被垃圾回收机制回收销毁呢?
这是因为垃圾回收机制:js规定在一个函数作用域内,程序执行完以后变量就会被销毁,这样可以节省内存。使用闭包时,按照作用域的特点,闭包(函数)外面的变量不会被销毁,因为函数会一直被调用,所以一直存在,所以闭包过多使用会造成内存泄漏。
参考链接:
www.ruanyifeng.com/blog/2009/0…
segmentfault.com/a/119000002…