2012-06-12 35 views
0

闭包是一个外部函数O,它的体内有一个变量x和一个内部函数F. F必须访问x。 O必须返回F,即F本身(或它的指针),而不是F的返回值。这种方式由于F可以从O外的代码调用,并且F需要执行x,所以x必须保持在范围之后O出口。我们可以关闭没有内部功能吗?

在JavaScript中,我们可以定义函数中的功能,因此它的直线前进。在C#中,我们必须使用匿名方法或匿名委托来具有与内部函数相同的行为。

封闭的essense是保留一个函数的局部变量的值,函数退出后,使下一次调用该函数时,以前的值已经存在。上述语法和技巧是完成闭包的方法。

反正有,在任何语言(比汇编语言之外)具有封闭的本质,而无需使用一个内部函数或委托。 OOP中的课程领域有相同的效果,但我正在寻找其他方法。

+1

类是穷人的关闭,关闭是穷人的类:)唯一改变的细节是如何实现后备存储。 – leppie

回答

0

的封盖,根据定义,在封闭在其词法作用域的变量。如果它不能与局部变量的其他东西“内在”,那将是完全无用的。所以几乎一个闭包必须能够在某个函数内部。

然而,一个复杂的是,在一些语言倒闭都与匿名函数有关。 (匿名函数通常必须是闭包;闭包不一定是匿名函数,但在某些语言中,唯一的闭包是匿名函数)。匿名函数的语法可能与常规(命名)函数的语法不同(特别是在函数和变量的单独命名空间;命名函数将位于函数名称空间中,但匿名函数将是数据)。在其中一些语言中,没有“内部”命名函数。

例如,在PHP中,所有命名功能是在全球范围内。当一个命名函数定义在另一个(反直觉地)内部时,在外部函数运行时(在外部范围中声明,但延迟),定义全局范围内的内部函数(外部代码可以看到它)。但是,PHP 5.3+还具有匿名函数,这些函数是闭包;人们通常将匿名函数称为“闭包”,因为这些是语言中唯一的闭包。

另一个例子是Ruby。 def语法定义了一种方法。在另一个方法中定义一个方法(违反直觉)仍然将该方法定义为对其他方法可见。 Ruby还有使用lambda,procProc.new语法的关闭的匿名函数,但这些语法在语法上是不同的。

0

我不会称它们为闭包,但局部变量保留状态的概念是在VB中用Static局部变量。

Sub Example() 
    Dim normalVar As Integer 
    Static staticVar As Integer 

    normalVar += 1 
    staticVar += 1 

    Console.WriteLine("{0} {1}", normalVar, staticVar) 
End Sub 

(这是VB.NET,但Static在VB3或更早)。

这将输出

1 1 
1 2 
1 3 

如果调用三次。

相关问题