提问人:Maxim Gershkovich 提问时间:2/6/2011 最后编辑:CommunityMaxim Gershkovich 更新时间:9/7/2012 访问量:29713
闭包与匿名函数(区别?[复制]
Closure vs Anonymous function (difference?) [duplicate]
问:
可能的重复项:外行术语来说,PHP 或 Javascript 中的 Closures/Lambda 是什么?
“闭包”和“lambda”有什么区别?
你好
我一直无法找到一个定义来清楚地解释闭包和匿名函数之间的区别。
我看到的大多数参考资料都清楚地指出它们是不同的“事物”,但我似乎无法弄清楚为什么。
有人可以为我简化一下吗?这两种语言功能之间有什么具体区别?哪一个更适合什么场景?
答:
112赞
Anurag
2/6/2011
#1
匿名函数只是一个没有名称的函数;而已。闭包是捕获周围环境状态的函数。
匿名函数不一定需要创建闭包,并且闭包不是仅为匿名函数创建的。
考虑这个假设的反例。考虑一种语言 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);
}
评论
2赞
Pacerier
8/27/2013
你能为你的答案中使用的定义引用一些来源吗?
2赞
Anurag
8/28/2013
@Pacerier 除了问题中已经引用的定义之外,我没有使用任何定义,这基本上是 和 .我自己想出了这些例子,所以无法为这些例子提供外部参考。closures
anonymous functions
1赞
Niels Abildgaard
9/2/2014
澄清一下,在上一个示例中,从匿名函数中省略参数仍会产生有效的代码,因为 JavaScripts(非常不直观)的作用域模型。greeting
4赞
Anurag
1/17/2015
@NielsAbildgaard - 很好,我只是在说明它在没有闭包的语言中会是什么样子。这是 JavaScript 语法,这让它令人困惑,但这个想法是一种没有闭包的通用语言。
4赞
Buttle Butkus
4/6/2016
PHP的官方文档似乎交替使用“闭包”和“匿名函数”,即使它们的闭包在不使用“use”语言结构的情况下不会捕获周围的状态。“匿名函数,也称为闭包,允许创建没有指定名称的函数。”php.net/manual/en/functions.anonymous.php
评论