代码之家  ›  专栏  ›  技术社区  ›  Andreas Grech

在JavaScript中,“闭包”具体指的是什么?

  •  69
  • Andreas Grech  · 技术社区  · 16 年前

    我知道闭包是什么,但我在摸索这个词的确切含义时遇到了一些困难。 closure 是指。我在许多网站上看到过这个词,但他们很少同意它的实际定义。

    • 是保存在堆栈框架上的变量吗?
    • 它是正在返回的函数吗?
    • 它是外部功能的范围吗?
    • 它是内部(返回)函数的作用域吗?
    • 也许是 概念 返回函数后是否将变量保存在堆栈框架上?

    有人能确切告诉我 关闭 是指?

    7 回复  |  直到 8 年前
        1
  •  45
  •   Robusto    8 年前

    JavaScript Closures

    两个一句话摘要:

    闭包是 功能-在 函数已返回,或

    闭包是一个堆栈框架,它是 当函数 返回。(就像“堆栈帧”是 Malloc'ed而不是 堆栈!)

    关于关闭的一篇很好的文章

    Javascript Closures

    “闭包”是一个表达 (通常是一个函数)可以 自由变量与 绑定这些变量的环境 (即“关闭”表达式)。

    一个闭包的简单解释是 这本书让内心 函数;函数定义和 内部的函数表达式 其他功能的功能体。 这些内部功能是 允许访问所有本地 变量、参数和声明 外部内部功能 函数(s)。当 其中一个内部功能是 可在函数外部访问 把它装在里面,这样它就可以 在外部功能之后执行 已返回。在那一点上它仍然 可以访问局部变量, 参数和内部功能 其外部函数的声明。 这些局部变量、参数和 函数声明(最初)具有 他们拥有的价值观 返回了外部函数,可以 通过内部功能与交互。

    这里有个很好的例子

    JavaScript, time to grok closures

        2
  •  6
  •   Daniel Rodriguez    16 年前

    它是一个函数,用于“保存”对另一个范围内的某个对象的引用。例如:

    var myArrayOfFunctions = [];
    
    for(var i = 0; i<3: i++)
    {
        //Note how the function being defined uses i, 
        //where i lives in the parent's scope, this creates a closure
        myArrayOfFunctions[i] = function(a) { return a + i;}    
    }
    
    myArrayOfFunctions[0](5);   //Prints 8 WTF!
    myArrayOfFunctions[1](5);   //8 again
    myArrayOfFunctions[2](5);   //Well, this 8 was expected
    

    这是因为当函数被“创建”时,它们不复制i的值,它们保存对i的引用,所以当我们调用函数时,它们使用i的当前值,即3。

    Here is a graphical explanation.

        3
  •  4
  •   Mic    16 年前

    对于我来说,JS中的闭包允许您执行以下操作。
    当添加到“b”时,“a”在内部函数中仍然可用,尽管它在外部声明。

    function adder(a){
      return function(b){
        return a + b;
      };
    }
    var add5 = adder(5);
    alert( add5(10) );
    

    对于JS闭包的极端用法,您可以查看 source code 纯库(JS模板引擎)

        4
  •  2
  •   intgr    16 年前

    据我所知,闭包是在另一个函数中定义的一个函数,它超出了父函数的作用域。一个常见的例子是回调:

    function delay_message(msg)
    {
         setTimeout(function closure() { alert(msg); }, 1000);
    }
    

    在这种情况下,上述 function closure 在主体中定义 delay_message ,但函数定义——以及父函数的变量 msg --超出 延迟消息 函数调用。

        5
  •  2
  •   sarath joseph    11 年前

    考虑以下用变量a和b创建闭包的代码

    closure=(function(){ 
    
        var a=3
        var b=5 
    
    return  function(operation){ 
              return operation(a,b)
          }
     }())
    
    
    // The variables a and b are now part of the closure (They are retained even after the outer function returns)
    
    
    closure(function(x,y){return x+y})  // outputs 8
    
    closure(function(x,y){return x*y}) // outputs 15`
    

    这个特殊的闭包现在可以接受对变量a和b进行操作的任何函数。

        6
  •  1
  •   Mark Ursino    16 年前

    本质上,闭包是一个函数体,它在本地环境中的标识符(变量)上关闭。

        7
  •  1
  •   Theodore Norvell    14 年前

    闭包是从嵌套函数声明或函数表达式(即lambda表达式)创建的函数值,其主体包含一个或多个对外部(但不是全局)范围中声明的变量的引用。