闭包的理解

作者: 小志1 | 来源:发表于2018-03-31 15:21 被阅读0次

先写段代码举例

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

相关文章

  • Gradle开发-Groovy闭包

    # 闭包 闭包的基础知识 闭包的使用 闭包 this,owner,delegate 的理解 总结 ## 闭包的基础...

  • Swift5 闭包及其应用

    关于如何理解闭包 学习闭包的第一个难点就是理解闭包,可能很多人用了很久的闭包都还不太清楚闭包到底是什么,我这里提供...

  • 【js基础修炼之路】— 深入浅出理解闭包

    之前对于闭包的理解只是很肤浅的,只是浮于表面,这次深究了一下闭包,下面是我对闭包的理解。 什么是闭包? 引用高程里...

  • JS闭包理解

    闭包的概念 闭包就是能够读取其他函数内部变量的函数。 一、变量的作用域 要理解闭包,首先必须理解Javascrip...

  • 自动闭包/逃逸闭包/非逃逸闭包

    自动闭包、逃逸闭包和非逃逸闭包三个概念有些不好理解,这里按我自己的理解总结一下,不对的地方请指正 一、非逃逸闭包:...

  • 闭包理解

    这次我发现了个奇怪的问题,高程经典的闭包陷阱,竟然是把一个未执行的函数赋值给了一个数组项,当年的我太年轻,竟然没看...

  • 理解闭包

    什么是「闭包」。 「闭包」的作用是什么。在一个立即执行函数当中: 首先,假设以上几行代码运行在立即执行函数当中,那...

  • 理解闭包

    什么是闭包?闭包是什么时候创建的?能不能看到闭包?从这三点出发学习。 在维基百科中的闭包:词法闭包的简称。是引用了...

  • 理解闭包

    spark 比较难得一个事情之一就是当在集群上执行代码的时候,变量和方法的范围和生命周期。Rdds 的操作 能够修...

  • 理解闭包

    欢迎移步我的博客阅读:《理解闭包》 闭包 是指可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码...

网友评论

    本文标题:闭包的理解

    本文链接:https://www.haomeiwen.com/subject/qywgcftx.html