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

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

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