本人开始接触编程是从js开始的,当时网上很多人说闭包是难点,各种地方对闭包的解释也是千奇百怪。如今开始接触js以外的各种编程语言,发现不光是js,php、java、c等各种编程语言里都有闭包,而且大体意思是差不多的。
js里的闭包
比较权威的高程里是这样解释闭包的:
闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另
一个函数。
当初看这个解释有点懵逼,理解成闭包就是函数中的函数了。现在看来感觉有点问题,不知道是不是翻译的问题,全局作用域下的函数不也是闭包吗?
再看下mdn的解释:
Closures (闭包)是使用被作用域封闭的变量,函数,闭包等执行的一个函数的作用域。通常我们用和其相应的函数来指代这些作用域。(可以访问独立数据的函数)
这个解释感觉靠谱多了,但是看起来也很复杂。
个人理解:闭包是一个相对独立的作用域,通俗的讲就是函数里{}包起来的部分。
重点就在与相对独立这个四个字,闭包不会被外界轻易影响,但他可以因为外部的变量,而且可以向外部输出变量,比如返回一个函数函数引用了闭包里的变量,这个变量就不能被轻易修改。
js里没有块级作用域,啥是块级作用域,在很多语言中,if(1){} for(var i; i<10; i++){}这些带{}语句都是相对独立的作用域,里面申明的变量在外面不可用。但在js中没有这个概念,循环完了,在外面还能访问i=10。所以es6引入了let关键词,相当于有了块级作用域。
个人理解,闭包和块级作用域意思非常相近。不过闭包的应用范围更广,我们经常需要用函数构建一个闭包防止作用被污染,最典型的就是iife。
php里的闭包
最近不满足于只干前端的活,开始用起了php。php不愧是最好的语言,抄起来就是一梭子。php里也有闭包,下面对比着js来看一下。
php官网对闭包的解释:
匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值。
php里的闭包和js其实很像啊,也是和函数有关,其实本质上也是一个相对独立的作用域,常用在回调函数。值得一题的是php的闭包闭的更彻底,他不能主动访问外部变量,而是要主动用use关键词传进去,而且这个传参还是值传递,如果想引用传递还得加上&。
$example = function () {
var_dump($message);
};
$example = function () use (&$message) {
var_dump($message);
};
各位觉得php这个设定是多此一举吗?个人觉得这样更保险啊。
还有很多语言里有闭包,有生之年希望能补上其他几种流行语言中的闭包对比,例如c/c++、java、go等,手动斜眼>>