2011-02-06 96 views
49

可能顯示的文件(差值):
What is Closures/Lambda in PHP or Javascript in layman terms?
What is the difference between a 'closure' and a 'lambda'?封閉VS匿名函數

嗨,

我一直無法找到一個定義,清楚地解釋了閉包和匿名函數之間的區別。

我已經看到的大多數參考文獻明確指出它們是不同的「事物」,但我似乎無法理解爲什麼。

有人能爲我簡化嗎?這兩種語言功能之間的具體區別是什麼?在哪些情況下哪個更合適?

+2

都能跟得上,但它是http://stackoverflow.com/questions/220658/what-is-the-difference-between-a-closure-and-a-lambda我的壞 – 2011-02-06 07:18:10

回答

74

匿名函數只是一個沒有名字的函數;而已。閉包是捕獲周圍環境狀態的函數。

匿名函數不一定需要創建閉包,並且閉包不是僅爲匿名函數創建的。

考慮這個假設的反例。考慮一種語言Foo,它不支持閉包但支持匿名函數。這種語言可能無法編譯或爲下面的代碼拋出錯誤,因爲「greeting」未在內部函數的範圍內定義。它是匿名的這一事實是無關緊要的。

function outer() { 
    var greeting = "hello "; 

    (function(name) { 
     alert(greeting + name); 
    })("John Doe"); 
} 

讓我們考慮一個現在支持閉包的實際語言 - JavaScript。以同樣的例子同上,但命名的內部函數這個時候給出:

function outer() { 
    var greeting = "hello "; 

    (function inner(name) { 
     alert(greeting + name); 
    })("John Doe"); 
} 

雖然內部函數不是匿名了,它仍然從周圍環境中捕捉狀態。

閉包提供了非常需要的便利,否則我們會傳遞函數的每個單獨依賴作爲參數。

function outer() { 
    var greeting = "hello "; 

    (function(name, greeting) { 
     alert(greeting + name); 
    })("John Doe", greeting); 
} 
+0

你能舉的副本您的答案中使用的定義的一些來源? – Pacerier 2013-08-27 08:40:40