2010-11-05 100 views
14

好吧,这有点儿迂腐的问题,但我想确保我正确理解定义。使用封闭的绰号来形容匿名函数可以在局部范围内电梯变量(无论他们实际上做还是不做)或者只有当他们电梯变量在局部范围内?由于它可以做什么或因为它会关闭

换句话说,如果一个匿名函数有能力解除变量在本地范围内(因为语言提供了这种能力),但不,它仍然被认为是封闭?

我的理解是,只有当局部变量被解除时它才是闭包。但是一个匿名函数不会(即使它可以)不是闭包。所以并非所有匿名函数都是闭包,但所有闭包都是匿名函数。

再一次,很抱歉,这些事情啃着我。 :)

+0

只要你问,而不是教,你对我来说并不迂腐^^(http://dictionary.reference.com/browse/pedantic)。这个问题也令我感兴趣! – 2010-11-05 05:23:36

+1

另一种看待它的方法是,在具有闭包的语言中,为了统一起见,不提升局部变量的匿名函数可能仍然以实际闭包的相同方式在运行时表示。但是现在你提到它了,是的,人们倾向于只在存在一些变量捕获时才使用“闭包”。 – 2010-11-05 05:35:23

回答

25

假设你的意思是计算机科学的背景下...

闭包是一个一流的功能,捕捉在其定义的环境自由变量的词法绑定。一旦它捕获了词法绑定,函数就变成了一个闭包,因为它“关闭了”这些变量。

注意这意味着闭包只存在于运行时。

对于一个函数是闭包是正交的函数是匿名或命名。您可以创建一种语言,使您可以将指定的函数定义为闭包。

这里是Python中的“命名”关闭:

def maker(): 
    count=[0] 
    def counter(): 
    count[0]=count[0]+1 
    return count[0] 
    return counter 
+0

所以如果它不捕获局部变量,那么它不会“关闭”任何变量,因此它不是闭包;这就说得通了。在运行时只关闭的好处。但是我猜,如果它在运行时会成为闭包,我们可以说它是代码中的闭包。可能不是本体论上的正确,但这样说起来很方便。感谢您提出关于闭包的概念如何与anon函数的概念正交的观点。我甚至没有想过,但这是有道理的。 – hcoverlambda 2010-11-05 06:04:44

+1

但是,在Python和JavaScript等语言中,包含*的范围*是绑定的,而不仅仅是自由变量。例如,考虑在分支中使用'eval'或'locals()' - 不要少!现在怎么办? :-) – 2010-11-05 06:49:26

+1

Python不绑定范围。当你评估'counter'定义时,它会为每个捕获的变量创建一个“封闭单元”,并将它们存储在'counter'函数中。 'maker().__ closure __ [0] .cell_contents'是在定义'counter'时绑定到'count'的列表的引用。 (也有点令人困惑的是,Python有时使用“闭包”来引用单元的元组,而不是保存它们的函数,但忽略它)。同时,'maker().__ code __。co_freevars [0]'是' “c''。这就是它知道在单元0上对'c'的引用是一个'LOAD_DEREF'。 – abarnert 2013-08-02 23:36:36

0

一个封闭的一个伟大的定义在这里定义: lua.org

当一个函数被写入包含在另一个函数,它可以完全访问封闭函数中的局部变量;这个特征被称为词法范围。虽然这听起来很明显,但事实并非如此。在编程语言中,词法范围界定和一流功能是一个强大的概念,但很少有语言支持该概念。

相关问题