0

闭包是一个外部函数 O,它的主体中有一个变量 x 和一个内部函数 F。F 必须访问 x。O 必须返回 F,即 F 本身(或其指针),而不是 F 的返回值。这样由于 F 可以从 O 外部的代码中调用,并且 F 需要执行 x,x 必须保持在作用域之后O出口。

在 javascript 中,我们可以在函数中定义函数,所以它很简单。在 C# 中,我们必须使用匿名方法或匿名委托才能具有与内部函数相同的行为。

闭包的本质是在函数退出后保留函数局部变量的值,以便下次调用函数时,先前的值已经存在。上面提到的语法和技术是完成闭包的方法。

无论如何,在不使用内部函数或委托的情况下,是否有任何语言(汇编语言除外)具有闭包的本质。当然,OOP 中的类中的字段具有相同的效果,但我正在寻找除此之外的方法。

4

2 回答 2

1

根据定义,闭包在其词法范围内关闭变量。如果它不能“内在”于其他带有局部变量的东西,那将是完全没用的。所以几乎一个闭包必须能够在某个函数内部。

然而,一种复杂性是某些语言中的闭包与匿名函数密切相关。(匿名函数通常必须是闭包;闭包不必是匿名函数,但在某些语言中,唯一的闭包是匿名函数。)匿名函数的语法可能不同于常规(命名)函数的语法(尤其是在具有函数和变量的单独命名空间;命名函数将在函数命名空间中,但匿名函数将是数据)。在其中一些语言中,没有“内部”命名函数。

例如,在 PHP 中,所有命名函数都在全局范围内。将命名函数定义放入另一个(违反直觉)在外部函数运行时定义全局范围内的内部函数(外部代码可以看到它)(好像它是在外部范围中声明的,但延迟了)。然而,PHP 5.3+ 也有匿名函数,它们是闭包;人们通常将匿名函数称为“闭包”,因为它们是该语言中唯一的闭包。

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

于 2012-06-12T18:20:07.960 回答
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

如果叫了三遍。

于 2012-11-14T14:48:14.120 回答