关闭与匿名功能(差异?)

时间:2011-02-06 07:07:52

标签: closures anonymous-function

  

可能重复:
  What is Closures/Lambda in PHP or Javascript in layman terms?
  What is the difference between a 'closure' and a 'lambda'?

您好,

我一直无法找到一个明确解释闭包和匿名函数之间差异的定义。

我看到的大多数参考文献都清楚地指出它们是截然不同的“事物”,但我似乎无法理解为什么。

有人可以为我简化一下吗?这两种语言功能之间有哪些具体差异?在哪些情况下哪一个更合适?

1 个答案:

答案 0 :(得分:88)

匿名函数只是一个没有名字的函数;而已。闭包是捕捉周围环境状态的函数。

匿名函数不一定需要创建闭包,并且不会仅为匿名函数创建闭包。

考虑这个假设的反例。考虑一种语言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);
}