JavaScript中的“闭包”究竟是指什么?

时间:2009-11-26 06:52:57

标签: javascript closures definition

我理解闭包是什么,但我在查找closure这个术语的确切含义时遇到了一些麻烦。我已经看过许多网站上使用的术语,但他们很少同意它的实际定义。

  • 是堆栈框架上保留的变量吗?
  • 是否正在返回函数?
  • 是外部功能的范围吗?
  • 是内部(返回)函数的范围吗?
  • 是否可能概念在返回函数后将变量保留在堆栈框架上?

有人能告诉我closure指的是什么吗?

8 个答案:

答案 0 :(得分:45)

来自JavaScript Closures

两个一句话摘要:

  

闭包是a的局部变量   功能 - 保持活力   函数已返回,或

     

闭包是一个堆栈框架   当功能没有解除分配   回报。 (好像是'堆叠框架'   malloc'ed而不是在   栈!)

关于闭包的非常好的文章

Javascript Closures

  

“闭包”是一种表达方式   (通常是一种功能)可以拥有   自由变量和   绑定这些变量的环境   (“关闭”表达式)。

     

关闭的简单解释是   ECMAScript允许内部   功能;功能定义和   内部的函数表达式   其他功能的功能体。   那些内在的功能是   允许访问所有本地   变量,参数和声明   内在的功能在他们的外部   功能)。闭合时形成   其中一个内部功能是   在函数外部可访问   包含它,以便它可以   在外部函数之后执行   已经回来了。它仍然存在   有权访问局部变量,   参数和内在功能   声明其外部功能。   那些局部变量,参数和   函数声明(最初)有   当他们拥有的价值观   返回外部函数,可能是   与内在的功能相互作用。

这里的一个很好的例子

JavaScript, time to grok closures

答案 1 :(得分:6)

这是一个“保存”引用或引用另一个范围内的东西的函数。例如:

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.

答案 2 :(得分:4)

对我来说,JS中的闭包可以让你做到以下几点 当添加到“b”时,“a”在内部函数中仍然可用,尽管它在外部声明。

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

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

答案 3 :(得分:2)

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

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

在这种情况下,上面的function closure是在delay_message的主体内定义的,但是函数定义 - 以及父函数的变量msg - 超出了范围delay_message函数调用。

答案 4 :(得分:2)

考虑以下使用变量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进行操作的函数

答案 5 :(得分:1)

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

答案 6 :(得分:1)

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

答案 7 :(得分:0)

关闭表示包含另一个功能(内部功能)的功能(外部功能)。

关闭用于保护数据。

在下面的视频链接中介绍了使用closer的情况:

https://www.youtube.com/watch?v=w1s9PgtEoJs