对闭包的总结

吐槽君 分类:javascript

什么是闭包

闭包就是能够访问另一个函数作用域中变量的函数。我们知道,函数作用域是独立的、封闭的,外部的执行环境是访问不了的,但是闭包可以。例子如下:

    //无法访问到局部变量
   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…

回复

我来回复
  • 暂无回复内容