你最好问的具体点
闭包很简单,就是在函数定义时把函数外部的环境打包进函数内,使得在函数体内可以访问到函数体外的环境(主要是访问函数体外的变量)
// 假设这里的环境为 (1)
function(){
// 假设这里的环境为 (2)
function(){
// 假设这里的环境为 (3)
};
};
在环境(1)中只能访问到环境(1)的变量,但是环境(2)中能同时访问到环境(1)(2)中的变量。环境(3)中能同时访问到环境(1)(2)(3)中的变量。
函数在定义时,把函数体外部的环境全部打包进了函数,使得函数体内可以访问到函数体定义外面的环境。这个函数+所打包的外部环境就称之为闭包。
函数里面的能访问外面的变量,外面的不能访问里面的变量
是这样,我也是花了好长时间才内化的闭包。主要是因为原来只写过 java ,对 js 里面函数可以直接当参数传递这个事一时半会不习惯(java8 现在也已经支持行为化参数了)。闭包的真正用处是对于那写能够把函数当成参数传来传去的语言的。这个函数是必会有一些自己的东西(能访问到的变量等),这些东西随着代码的执行,一直会被这个函数访问到,这样,这个函数就形成了一个闭包。如果此时你还把这个函数当成参数传递,那么相应的这些东西(变量等)也就一起跟着过去了(能访问到)。
三点: 1. 编程中的闭包与数学中的闭包:两者概念不同。 2. 编程中的闭包是什么?本质上是一个只有子孙域可以访问得到的公共域。(域可以看作环境、变量;JS中只有function会创建域) 3. 为什么要用闭包?复用、模块化(命名空间)、更好的描述。 关于"复用、更好的描述"可以看这个例子:https://segmentfault.com/a/1190000004589338, 关于"模块化(命名空间)"其实很好理解,localEnv的命名不会覆盖(污染)topEnv嘛!
所有的语言特性都是为了更好的描述!
不同语言下闭包有差别;一般不用理解,直接用即可,偶尔踩踩坑了,查搜索引擎为什么踩坑。实在蛋疼的话,选择一两个语言看看他们对闭包的实现机制。