可能的复制品: 什么是 PHP 中的闭包/Lambda,什么是 Javascript 中的外行术语? A 闭合和 a lambda 闭合的区别是什么
嗨,
我一直无法找到一个定义来清楚地解释闭包和匿名函数之间的区别。
我看到的大多数推荐信都明确指出它们是截然不同的“东西”,但我似乎不能理解其中的原因。
有人能帮我简化一下吗?这两种语言特征之间的具体差异是什么?在什么情况下哪一个更合适?
匿名函数只是一个没有名称的函数,仅此而已。闭包是一个捕获周围环境状态的函数。
匿名函数不一定需要创建闭包,而且闭包也不仅仅是为匿名函数创建的。
考虑一下这个假设的反例。考虑一种不支持闭包但支持匿名函数的 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); }