闭包的理解

先写段代码举例

var aa = '1'
function bb() {
    console.log(aa)
}

上面代码就是一个闭包。

如果一个函数,使用了它范围外的变量,那么(这个函数+这个变量)就叫做闭包

闭包的两大好处:

  • 一个可以读取函数内部的变量
  • 另一个就是让这些变量的值始终保持在内存中
    闭包一般伴随着函数嵌套,有时候要得到函数内的局部变量,就需要在函数内部再定义一个函数

1.读取函数内部的变量

function f1() {    
    var n = 100;    
    function f2() {      
        console.log(n);    
    }    
    return f2;  
}  
var result = f1();  
result(); // 100

上面代码中,f2被嵌套在f1内部,f1的全部变量,f2都是可以访问的。但是反过来不行。所有我们可以把f2作为返回值,这样f1就可以访问了。

2.变量的值始终保持在内存中

function f1(){
  var n=999;
  nAdd=function(){n+=1}
  function f2(){
    console.log(n);
  }
  return f2;
}
var result=f1();
result(); // 999
nAdd();
result(); // 1000

f2是一个嵌套函数的闭包,执行了两次,第一次值是999,第二次是1000.证明了函数f1的局部变量n一直保存在内存中,没有在f1调用后清除。
因为 f1f2的父函数,f2被赋给了一个全局变量n,导致f2一直在内存中,因为f2f1中,故f1也在内存中。(内存回收是没有任何地方用到这个变量或者函数,那么就被回收)。
其中nAdd没有用var定义,是个全局变量。nAdd后面的函数是匿名函数也是一个闭包,nAdd相当于一个setter,可以在函数外部对函数内部的局部变量进行操作。

两个例子

var name = "The Window";
var object = {
  name : "My Object",
  getNameFunc : function(){
    return function(){
      return this.name;
    };
  }
};
console.log(object.getNameFunc()()); //The Window
var name = "The Window";
var object = {
  name : "My Object",
  getNameFunc : function(){
    var that = this;
    return function(){
      return that.name;
    };
  }
};
console.log(object.getNameFunc()());  //My Object
参考文档:

1.https://zhuanlan.zhihu.com/p/22465092
2.http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。 一、变量...
    zouCode阅读 1,296评论 0 13
  • 闭包:从字面意思来理解就是封闭和包裹,换句话说,就是在函数内部定义的变量,在函数的外部无法访问到,因此就说函数构成...
    清葉阅读 580评论 1 0
  • 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。 一、变量...
    zock阅读 1,091评论 2 6
  • 接触过JS的同学们一定都知道闭包这个名词,在我刚开始学习JS的时候,闭包对于我是一个很高大上很难理解的存在,今天终...
    W北落师门W阅读 292评论 0 1
  • 每天出来,上班,下班,我看到都是墙壁,还有在墙壁的缝隙中生存的人们,我多么渴望,如饥似渴地想要看到没有尽头天空,穷...
    一根芦苇的私语阅读 296评论 0 0