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

IT技术 javascript closures definition
2021-03-06 13:32:40

我明白闭包是什么,但我在理解这个术语closure所指的内容时遇到了一些麻烦我在许多网站上看到过这个术语,但他们很少就它的实际定义达成一致。

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

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

6个回答

来自JavaScript 闭包

两个一句话总结:

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

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

一篇关于闭包的好文章

Javascript 关闭

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

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

一个很好的例子在这里

JavaScript,是时候了解闭包了

A closure is the local variables for a function - kept alive after the function has returned, or它应该只是可变的吗?还是功能?或两者?因为在官方文档中他们说内部函数是闭包。developer.mozilla.org/en-US/docs/Web/JavaScript/Closures
2021-04-26 13:32:40
我已经写了一组带有图形解释的文章。在此处阅读第 4 章和第 5 章:rahuldotout.wordpress.com/2011/05/15/...
2021-05-13 13:32:40

它是一个“持有”一个或多个对另一个范围内某物的引用的函数。例如:

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。

这是一个图形解释。

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

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

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

我看到了第 83 页……确实很相似。但是这本书是在这个答案之后将近一年印刷的;)
2021-04-21 13:32:40
你是从 Stoyan Stefanov 的 JavaScript Patterns 书中得到这个例子的吗?
2021-04-26 13:32:40
我知道闭包是做什么用的,但你的回答仍然没有真正完善closure真正指的是什么
2021-04-27 13:32:40
@Dan,不。为什么?它是完全一样的吗?
2021-05-03 13:32:40
我喜欢这个例子,因为它是我所知道的较小的一个展示闭包是什么的例子,并且在学习函数式 JS 时对我来说是最有启发性的。
2021-05-14 13:32:40

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

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

在这种情况下,上面的内容function closure是在 的主体内定义的delay_message,但是函数定义——以及父函数的变量msg——比delay_message函数调用的范围长

所以你是说闭包 <i> 是 </i> 内部函数?
2021-04-27 13:32:40
内部函数 ( function closure) 在解析时创建,但此时没有闭包。一个闭包是在function delay_message执行时创建的,并将其状态绑定到function closure.
2021-04-27 13:32:40
匿名函数不是闭包。请不要继续传播这种用词不当的说法。
2021-05-02 13:32:40
“闭包”是函数及其状态的组合。即,从外部函数绑定到一组局部变量的内部函数。
2021-05-07 13:32:40

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