匿名函數只是一個沒有名字的函數;而已。閉包是捕獲周圍環境狀態的函數。
匿名函數不一定需要創建閉包,並且閉包不是僅爲匿名函數創建的。
考慮這個假設的反例。考慮一種語言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);
}
都能跟得上,但它是http://stackoverflow.com/questions/220658/what-is-the-difference-between-a-closure-and-a-lambda我的壞 – 2011-02-06 07:18:10