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

Max*_*ich 67 closures anonymous-function

可能的重复:
什么是PHP或Javascript中的Closures/Lambda外行术语?
'闭包'和'lambda'有什么区别?

嗨,

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

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

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

Anu*_*rag 93

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

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

考虑这个假设的反例.考虑一种语言Foo,它不支持闭包但支持匿名函数.这种语言可能无法编译或为下面的代码抛出错误,因为"greeting"未在内部函数的范围内定义.它是匿名的这一事实无关紧要.

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

    (function(name) {
        alert(greeting + name);
    })("John Doe");
}
Run Code Online (Sandbox Code Playgroud)

我们现在考虑一种支持闭包的实际语言--JavaScript.采用与上面相同的例子,但这次命名内部函数给出:

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

    (function inner(name) {
        alert(greeting + name);
    })("John Doe");
}
Run Code Online (Sandbox Code Playgroud)

虽然内部函数不再是匿名的,但它仍然从周围环境中捕获状态.

闭包提供了非常必要的便利,否则我们会将函数的每个依赖项作为参数传递.

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

    (function(name, greeting) {
        alert(greeting + name);
    })("John Doe", greeting);
}
Run Code Online (Sandbox Code Playgroud)

  • @NielsAbildgaard - 好的一点,我只是用一种没有闭包的语言来说明它会是什么样子.这是JavaScript的语法,这使它令人困惑,但这个想法是一个没有闭包的通用语言. (3认同)
  • 您能否为您的答案中使用的定义引用一些来源? (2认同)
  • @Pacerier我没有使用除问题中已经引用的定义之外的任何定义,这基本上是`闭包`和`匿名函数`.我自己想出了这些例子,因此无法为这些提供外部参考. (2认同)
  • 似乎PHP的官方文档可以互换地使用"闭包"和"匿名函数",即使它们的闭包不会在不使用"使用"语言结构的情况下捕获周围状态."匿名函数,也称为闭包,允许创建没有指定名称的函数." http://php.net/manual/en/functions.anonymous.php (2认同)