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

And*_*ech 71 javascript closures definition

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

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

有人能告诉我到底是什么意思closure吗?

rah*_*hul 45

来自JavaScript闭包

两个一句话摘要:

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

闭包是一个堆栈帧,在函数返回时不会释放.(好像'stack-frame'是malloc'ed而不是堆栈!)

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

Javascript闭包

"闭包"是一个表达式(通常是一个函数),它可以将自由变量与绑定这些变量的环境("关闭"表达式)结合在一起.

关闭的简单解释是ECMAScript允许内部函数; 函数定义和函数表达式,位于其他函数的函数体内.并且允许那些内部函数访问其外部函数中的所有局部变量,参数和声明的内部函数.当其中一个内部函数在包含它的函数之外可访问时形成闭包,从而可以在外部函数返回之后执行闭包.此时它仍然可以访问其外部函数的局部变量,参数和内部函数声明.那些局部变量,参数和函数声明(最初)具有外部函数返回时的值,并且可以通过内部函数进行交互.

这是一个很好的例子

JavaScript,时间到grok闭包


Dan*_*uez 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
Run Code Online (Sandbox Code Playgroud)

这是因为当函数被"创建"时,它们不复制i的值,它们持有对i的引用,所以当我们调用函数时,它们使用i的当前值3.

这是一个图形说明.