封闭真正指的是什么?
我知道如何使用“闭包”......但闭包实际上指的是什么?
在MDN上,定义是它是一个函数。 这里是关于关闭的页面。 第一句话是“闭包是指涉及独立(免费)变量的函数。” 在第一个代码示例中,有一个注释突出了关闭函数。 然而,第二句似乎暗示闭包实际上是内部函数驻留的持久范围。这就是其他堆栈溢出答案所暗示的(搜索词“persistent”)。
那么,它是什么? 函数或持久作用域?
从技术上讲,闭包是持久作用域如何在函数中工作的机制 - 换句话说,就是实现。 这就是Lisp最初的意思。 在某些情况下,这仍然意味着什么 - 只要看一下关于各种Lisp方言中闭包的解释,并且他们几乎都试图用编译器/解释器如何实现闭包来解释它。 因为那是人们用来解释范围的方式。
我第一次遇到关于闭包的更简单的解释(即,解释行为而不是机制)是在javascript中。 现在越来越多的人习惯封闭的想法,这个词本身已经变得意味着:
捕获的内部函数范围允许函数引用外部函数的变量(这与最初的意思最为接近)
内部函数本身(通常在调用一级函数或lambda“闭包”的语言中)
封闭捕获的自由变量
我个人更喜欢最后的含义,因为它捕捉了闭包的本质:一种变量共享的形式,有点像全局变量。 但是,如果你想迂腐,只有第一个含义实际上是技术含义:“封闭”是指捕获的范围。
要回答你关于闭包是功能还是环境的问题,它就是 - 它是它所使用的功能和环境的组合。 在功能可以被定义(通常是匿名的)并作为参数传递给其他功能的语言环境中,这一点尤其重要(并且可能确实存在)(见证,例如,使用Smalltalk中的块,Lisp中的匿名函数/ Scheme范围等)。 问题是:如果在执行函数B期间创建全局函数A,并且A引用传递给B的名为P的参数; 如果A随后被存储在一个变量V中,然后在B返回后通过V被调用,A仍然需要访问P(这是B的一个参数,这个参数早已被A执行完了)为了做好工作; 因此,为了成功地完成工作,A必须有“关闭P”。 “关闭”是功能A本身和编译A时设置的环境的组合,它存储P的副本或引用或P的所有者,以便A可以成功完成其工作。
请注意,尽管使用了广泛使用闭包的语言(特别是Smalltalk和一些Lisp变体),但它通常被很好地隐藏起来,以致它不再透明 - 您甚至不会注意到它。 如果你注意到有一个关闭,海事组织没有做好。
因人而异。
祝你好运。
链接地址: http://www.djcxy.com/p/52021.html