闭包到底是什么啊?之前js里面听过一些,但是实际开发怎么感觉没怎么用到过这个概念?只是最近在学laraval的时候发现路由配置都是用闭包函数(教程里面这样说的),不懂这个闭包是什么意思?我看代码和js里面的匿名函数很像啊?感谢各位回答•﹏•
闭包到底是什么啊?之前js里面听过一些,但是实际开发怎么感觉没怎么用到过这个概念?只是最近在学laraval的时候发现路由配置都是用闭包函数(教程里面这样说的),不懂这个闭包是什么意思?我看代码和js里面的匿名函数很像啊?感谢各位回答•﹏•
闭包就是一段自由的代码块,在大多数语言的闭包中,基本都是以匿名函数的形式出现,在PHP和Js里可以把匿名函数理解为闭包,两者是一致的。当然,在PHP里,还有Closure对象来操作闭包。
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
广义上来说,匿名函数就是没有名字的函数,而闭包则是可以感知环境的函数,注意,这里指的环境是定义函数时的环境。
不太同意 @有明 的答案中JS部分的说法,在JS里,闭包不一定是匿名函数,MDN的文档中指出:
从文档中举的第一个例子:
可以看到,
displayName()
是有名字的,但也是一个闭包。回到PHP上来,从官方文档中可以看出,在PHP中闭包和匿名函数可以视为等同的:
按照Symfony主要作者Fabien Potencier在这篇文章On PHP 5.3, Lambda Functions, and Closures中的说法,PHP中匿名函数和闭包是有区别的:
我的结论是:理论上匿名函数和闭包是不一样的概念,在PHP中这两者概念与其他语言(比如JavaScript)是不一样的,这两者在使用上可以视为等同的。
至于问题中的关于什么时候使用的疑问,Fabien Potencier的文章中有详细的例子,建议仔细阅读。
参考:
MDN: JS闭包
PHP: 匿名函数
On PHP 5.3, Lambda Functions, and Closures