【问题标题】:Closure vs Anonymous function (difference?) [duplicate]闭包与匿名函数(区别?)[重复]
【发布时间】:2011-06-22 04:16:39
【问题描述】:

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

嗨,

我一直找不到能清楚解释闭包和匿名函数之间区别的定义。

我看到的大多数参考资料都明确指出它们是不同的“事物”,但我似乎无法理解为什么。

有人可以帮我简化一下吗?这两种语言功能之间的具体区别是什么?在什么场景下哪一个更合适?

【问题讨论】:

标签: closures anonymous-function


【解决方案1】:

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

匿名函数不一定需要创建闭包,闭包也不是只为匿名函数创建的。

考虑这个假设的反例。考虑一种不支持闭包但支持匿名函数的语言 Foo。该语言可能无法编译以下代码或引发错误,因为“问候”未在内部函数的范围内定义。它是匿名的这一事实无关紧要。

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);
}

【讨论】:

  • 您能否为您的答案中使用的定义引用一些来源?
  • @Pacerier 除了问题中已经引用的定义外,我没有使用任何定义,基本上是closuresanonymous functions。这些示例是我自己提出的,因此无法为这些示例提供外部参考。
  • 澄清一下,由于 JavaScript(非常不直观)的作用域模型,在上一个示例中从匿名函数中省略参数 greeting 仍然会产生有效代码。
  • @NielsAbildgaard - 好点,我只是在说明它在没有闭包的语言中会是什么样子。它是 JavaScript 语法,这让人困惑,但这个想法是一种没有闭包的通用语言。
  • PHP 的官方文档似乎可以互换使用“闭包”和“匿名函数”,即使它们的闭包在不使用“使用”语言结构的情况下不会捕获周围状态。 “匿名函数,也称为闭包,允许创建没有指定名称的函数。” php.net/manual/en/functions.anonymous.php
猜你喜欢
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 2014-09-12
  • 2013-08-29
  • 2017-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多