2010-11-05 34 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

當一個函數被寫入包含在另一個函數,它可以完全訪問封閉函數中的局部變量;這個特徵被稱爲詞法範圍。雖然這聽起來很明顯,但事實並非如此。在編程語言中,詞法範圍界定和一流功能是一個強大的概念,但很少有語言支持該概念。

相關問題