71

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

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

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

4

8 回答 8

45

来自JavaScript 闭包

两句话总结:

闭包是函数的局部变量 - 在函数返回后保持活动状态,或者

闭包是一个堆栈帧,在函数返回时不会被释放。(好像“堆栈帧”被分配而不是在堆栈上!)

关于闭包的一篇非常好的文章

Javascript 闭包

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

闭包的简单解释是 ECMAScript 允许内部函数;其他函数的函数体内的函数定义和函数表达式。并且允许这些内部函数访问其外部函数中的所有局部变量、参数和声明的内部函数。当其中一个内部函数可以在包含它的函数之外访问时,就会形成一个闭包,这样它就可以在外部函数返回后执行。此时它仍然可以访问其外部函数的局部变量、参数和内部函数声明。那些局部变量,

一个很好的例子在这里

JavaScript,是时候了解闭包了

于 2009-11-26T06:57:47.080 回答
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。

这是一个图形解释。

于 2009-11-26T07:09:09.833 回答
4

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

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

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

于 2009-11-26T16:44:31.387 回答
2

据我所知,闭包是在另一个函数中定义的函数,它的寿命超过了父函数的范围。一个常见的例子是回调:

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

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

于 2009-11-26T06:59:18.060 回答
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 进行操作的函数

于 2014-11-11T23:52:56.677 回答
1

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

于 2009-11-26T16:50:11.210 回答
1

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

于 2011-03-20T01:09:47.910 回答
0

闭包意味着一个函数(外部函数)包含另一个函数(内部函数)。

闭包用于保护数据。

在下面提供的视频链接中演示了 close 的使用:

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

于 2019-06-15T11:11:29.160 回答