javascript闭包 - php中的闭包函数和匿名函数有区别吗,何谓闭包?
天蓬老师
天蓬老师 2017-04-10 18:05:42
[PHP讨论组]

闭包到底是什么啊?之前js里面听过一些,但是实际开发怎么感觉没怎么用到过这个概念?只是最近在学laraval的时候发现路由配置都是用闭包函数(教程里面这样说的),不懂这个闭包是什么意思?我看代码和js里面的匿名函数很像啊?感谢各位回答•﹏•

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(3)
PHP中文网

闭包就是一段自由的代码块,在大多数语言的闭包中,基本都是以匿名函数的形式出现,在PHP和Js里可以把匿名函数理解为闭包,两者是一致的。当然,在PHP里,还有Closure对象来操作闭包。

大家讲道理

闭包是一个重要的函数特性,从概念去理解闭包感觉还是很抽象,建议结合词法环境来理解。会比较清晰。简单说就是允许函数访问其他引用环境中的变量。

天蓬老师

广义上来说,匿名函数就是没有名字的函数,而闭包则是可以感知环境的函数,注意,这里指的环境是定义函数时的环境。

不太同意 @有明 的答案中JS部分的说法,在JS里,闭包不一定是匿名函数,MDN的文档中指出:

闭包是指那些能够访问独立(自由)变量的函数 (变量在本地使用,但定义在一个封闭的作用域中)。换句话说,这些函数可以“记忆”它被创建时候的环境。

从文档中举的第一个例子:

function init() {
  var name = "Mozilla"; // name是被init创建的局部变量
  function displayName() { // displayName()是一个内部函数,
    alert(name); // 它是一个使用在父函数中声明的变量的闭包
  } 
  displayName();
}
init();

可以看到,displayName()是有名字的,但也是一个闭包。

回到PHP上来,从官方文档中可以看出,在PHP中闭包和匿名函数可以视为等同的:

匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。

按照Symfony主要作者Fabien Potencier在这篇文章On PHP 5.3, Lambda Functions, and Closures中的说法,PHP中匿名函数和闭包是有区别的:

To sum up, a lambda function is an anonymous PHP function that can be stored in a variable and passed as an argument to other functions or methods. A closure is a lambda function that is aware of its surrounding context.

我的结论是:理论上匿名函数和闭包是不一样的概念,在PHP中这两者概念与其他语言(比如JavaScript)是不一样的,这两者在使用上可以视为等同的。

至于问题中的关于什么时候使用的疑问,Fabien Potencier的文章中有详细的例子,建议仔细阅读。

参考:

  • MDN: JS闭包

  • PHP: 匿名函数

  • On PHP 5.3, Lambda Functions, and Closures

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号