2011-02-06 101 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