闭包真正引用了什么?

时间:2015-10-07 02:33:19

标签: javascript closures

我知道如何使用"闭包" ...但关闭这个词究竟是指什么?

在MDN上,定义是它是一个函数。 Here是关于闭包的页面。第一句话是,#34;闭包是指独立(自由)变量的函数。"在第一个代码示例中,有一个注释突出显示了闭包功能。然而,第二句似乎暗示闭包实际上是内部函数所在的持久范围。那也是this其他堆栈溢出答案的建议(搜索词"持久&# 34。)

那么,它是什么?功能还是持久范围?

2 个答案:

答案 0 :(得分:3)

从技术上讲,闭包是持久性作用域在函数中起作用的机制 - 换句话说,它就是实现。这就是它最初在Lisp方面的含义。在某些情况下,它仍然意味着什么 - 只要看看各种Lisp方言中闭包的解释,他们几乎都试图用编译器/解释器如何实现闭包来解释它。因为那是人们用来解释范围的方式。

我第一次遇到一个更简单的闭包解释(即解释行为而不是机制)是在javascript中。现在越来越多的人习惯了封闭的概念,这个词本身已经变得越来越明显:

  • 捕获的内部函数范围,允许函数引用外部函数的变量(这是最接近原始含义的)

  • 内部函数本身(通常在调用第一类函数或lambdas“闭包”的语言中)

  • 由闭包

  • 捕获的自由变量

我个人更喜欢最后的含义,因为它捕捉了闭包的本质:变量共享的一种形式,有点像全局变量。但是,如果你想要迂腐,只有第一个含义实际上就是技术含义:“封闭”指的是捕获的范围。

答案 1 :(得分:0)

要回答你关于闭包是功能还是环境的问题,它是两者兼而有之 - 它是它所使用的功能和环境的组合。它在语言的上下文中特别重要(并且可能真的只存在),其中函数可以定义(通常是匿名的)并作为参数传递给其他函数(见证,例如,在Smalltalk中使用块,匿名Lisp / Scheme领域的函数,等等)。问题是这样的:如果在执行函数B期间创建了全局函数A,并且A引用了一个名为P的参数,该参数被传递给B;如果A随后存储在变量V中,然后在B返回后通过V调用,则A仍然需要访问P(这是B的参数,该参数早已在执行A时完成)为了做好自己的工作;因此,A必须关闭P"为了成功地完成它的工作。 "关闭"是一个函数A本身和编译A时设置的环境的组合,它存储了一个副本或引用或者你的P是什么让A能够成功地完成它的工作。

请注意,尽管使用了大量使用闭包的语言(特别是Smalltalk和一些Lisp变体),但它通常被埋没得非常透明 - 你甚至都不会注意到它。如果您注意到关闭,IMO就做得不好。

因人而异。

祝你好运。