closures - 闭包与匿名函数(区别?)

标签 closures anonymous-function

Possible Duplicates:
What is Closures/Lambda in PHP or Javascript in layman terms?
What is the difference between a 'closure' and a 'lambda'?

嗨,

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

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

有人可以帮我简化一下吗?这两种语言特性之间有什么具体区别?哪一种更适合什么场景?

最佳答案

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

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

考虑这个假设的反例。考虑一种不支持闭包但支持匿名函数的语言 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);
}

关于closures - 闭包与匿名函数(区别?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4912116/

相关文章:

javascript - 了解范围

closures - 如何编写一个可以组成 `FnMut` 闭包的函数?

collections - 关闭的集合。不同的调用方式。

javascript - 在 JavaScript 中命名对象属性的方法是一个好习惯吗?

ios - 创建 swift 闭包并将其作为完成 block 传递给 objective-c 类

javascript - 如何在回调中调用对象的键?

java - 使用 Scala 函数而不是类似 Java 回调的匿名对象

PHP 闭包给出了奇怪的性能行为

recursion - OCaml 中的匿名递归函数

lambda - 匿名函数什么时候执行?它没有名字可以称呼!