「闭包」是个很学术性的概念,在每个编程语言里闭包的含义可能都有差异,尤其是在 JavaScript 里,规范文档里根本没有直接给闭包下过定义,所以可以认为闭包完全不存在。
前段时间有人问 JavaScript 之父 」每个 JavaScript 函数都是闭包」 的说法到底对不对 https:// twitter.com/BrendanEich /status/1376546443847102465 (要梯子)。JavaScript 之父给解释了很多(面试题都回答,果然是最接地气的编程语言之父),具体怎么解释的我就不翻译了,总之他也觉得闭包这个概念并不是非得提的东西,最后还建议那个人把 MDN 上讲闭包的概念删了得了。
其实从口头上,JavaScript 之父是把嵌套函数认为是闭包的,比如 15 年说的这句
以及早期 SpiderMonkey 代码里的他写的注释:
现在我们觉得能访问上层作用域里的变量的函数太正常不过了,但在当时,是一个新特性,之前只有全局的顶层函数,顶层函数里只能访问自己的本地变量和全局变量,没有上层作用域一说。
如今这个年代,既然我们写的大部分函数都是闭包,那面试还问啥闭包,干脆不要问了。