什么“闭包”在JavaScript中引用?

我明白什么是封闭的,但是在closure这个术语的意义上,我有一些麻烦。 我曾经在很多网站上看过这个词,但是很less就这个词的实际定义达成一致。

  • 它是保留在堆栈帧的variables吗?
  • 它是被返回的函数吗?
  • 它是外部函数的范围吗?
  • 它是内部(返回)函数的范围吗?
  • 这可能是在返回函数后将variables保留在栈帧上的概念吗?

有人能告诉我究竟closure是指什么?

从JavaScriptclosures

两个一句话总结:

闭包是函数的局部variables – 在函数返回后保持活动状态

闭包是函数返回时不会释放的栈帧。 (就好像一个'堆栈'被malloc',而不是在堆栈上!)

关于closures的一篇非常好的文章

Javascriptclosures

“闭包”是一个expression式(通常是一个函数),它可以将自由variables与一个绑定这些variables的环境(即“closures”expression式)一起使用。

关于Closure的简单解释是ECMAScript允许内部函数; 函数定义和函数expression式在其他函数的函数体内。 而且这些内部函数允许访问其外部函数中的所有局部variables,参数和声明的内部函数。 当这些内部函数之一被包含在其中的函数之外时,就可以形成一个闭包,这样它可以在外部函数返回之后执行。 在这一点上它仍然可以访问其外部函数的局部variables,参数和内部函数声明。 这些局部variables,参数和函数声明(最初)具有当外部函数返回时可以具有的值,并且可以通过内部函数进行交互。

这是一个很好的例子

JavaScript,时间来closures闭包

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

 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 

发生这种情况是因为当函数“创build”时,它们不会复制我的值,它们持有对i的引用,所以当我们调用函数时,它们使用的是i的当前值,即3。

这是一个graphics解释。

对我来说,JS中的closures允许你做以下事情。
尽pipe在外部声明了“a”,但在内部函数中仍然可以使用“a”。

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

对于JS闭包的极端使用,你可以看看PURE库的源代码 (一个JS模板引擎)

据我所知,闭包是在另一个函数中定义的函数,超出了父函数的范围。 一个常见的例子是callback:

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

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

考虑下面的代码,它用variablesa和b创build闭包

 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` 

这个特定的闭包现在可以使用任何对variablesa和b进行操作的函数

本质上,闭包是一个closures其本地环境中的标识符(variables)的函数体。

闭包是一个由嵌套函数声明或函数expression式(即lambdaexpression式)创build的函数值,其正文包含一个或多个在外部(而非全局)范围内声明的variables的引用。