zoukankan      html  css  js  c++  java
  • 闭包

    虽然工作有两年多了,但是对于闭包这个概念一直不甚解,查过一些博客和视频,大概有三种说法:

    1. 闭包可以简单的理解为函数嵌套
    2. 每一个函数都可以理解为闭包
    3. 闭包不是一句话可以简单概括的

    各有各的说法,也不知道到底信谁的,后来想到书是最有权威的,尤其是经典。

    JavaScript语言精粹对闭包是这样描述的:

      它首先列举了一个例子:

     //创建一个名为 quo 的构造函数
        //它构造出带有 get_status 方法和 status 私有属性的一个对象
        var quo = function (status) {
            return {
                get_status:function () {
                    return status;
                }
            };
        };
    
        //构造一个 quo 实例
        var myQuo = quo("amazed");
        document.writeln(myQuo.get_status());

      这个 quo 函数被设计成无须再前面加上new 来使用, 所以名字也没有首字母大写。当我们调用 quo 时,它返回包含get_status 方法的一个新对象。该对象的一个引用保存在myQuo中。即使quo 已经返回了,但是get_status 方法仍然享有返回 quo 对象的 status 属性的特权。get_status 方法并不是访问该参数的一个副本,它访问的就是该参数本身。这是可能的,因为该函数可以访问它被创建时所处的上下文环境。这就是闭包。

    JavaScript语言精粹对闭包是举例说明,好像闭包就是函数嵌套并返回子函数,这也是大多数人的理解。但是好像有点片面,而JavaScript高级程序设计就说的更详细了:

      闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数,仍以前面的 createComparisonFunction() 函数为例,注意加粗的代码。

    function createComparisonFunction(propertyName) {
           return function (object1, object2) {
               var value1 = object1[propertyName];
               var value2 = object2[propertyName];
               
               if(value1 < value2){
                   return -1;
               } else if(value1 > value2){
                   return 1;
               } else {
                   return 0;
               }
           };
       }

      在这个例子中,突出的那两行代码是内部函数(一个匿名函数)中的代码,这两行代码访问了外部函数中的变量 propertyName 。即使这个内部函数被返回了,而且是在其他地方被调用了,,但它仍然可以访问变量 propertyName 。之所以还能够访问这个变量,是因为内部函数的作用域链中包含createComparisonFunction() 的作用域。要彻底搞清楚其中的细节,必须从理解函数被调用的时候都会发生什么入手。

      第4章介绍了作用域链的概念。而有关如何创建作用域链以及作用域链有什么作用的细节,对彻底理解闭包至关重要。当某个函数被调用时,会创建一个执行环境(execution context)及相应的作用域链。然后,使用 arguments 和其他命名参数的值来初始化函数的活动对象(activation object)。但在作用域链中,外部函数的活动对象始终处于第二位,外部函数的外部函数的活动对象处于第三位,......直到作为作用域链终点的全局执行环境。

  • 相关阅读:
    CSS 盒子模型
    一个好的创业型团队需要下面几种人
    解决关闭Hadoop时no namenode to stop异常
    Hadoop RPC实例和通信过程分析
    实现RPC框架,几行代码就够了
    Linux 文件权限详解
    HDFS Java API 详解
    HDFS客户端的权限错误:Permission denied
    MongoDB GroupBy操作, 结果集大小限制问题。
    MongoDB 查询超时异常 SocketTimeoutException
  • 原文地址:https://www.cnblogs.com/gxp69/p/9786262.html
Copyright © 2011-2022 走看看