2012-06-12 34 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 

如果調用三次。

相關問題