闭包本身定义比较抽象,MDN官方上解释是:A closure is the combination of a function and the lexical environment within which that function was declared. 中文解释是:闭包是一个函数和该函数被定义时的词法环境的组合。 很多地方可以看到一个说法:js中每个函数都是一个闭包,这样理解也是没有问题的,不过会增加对闭包的理解难度,这里先不这么理解,可以按照闭包起的作用来理解它:就是能在一个函数外部执行这个函数内部定义的方法,并访问这个函数内部定义的变量。
在此,先看个经典的使用闭包的案例,实现在函数外部访问函数内部的局部变量:
function box(){
var a = 10;
function inner(){
return a;
}
return inner;
}
var outer = box();
console.log(outer());//10
正常情况,box执行过后,会被回收机制回收所占用的内存,包括其内部定义的局部变量。但是此时box执行过后返回一个内部的函数inner,这个inner引用了内部的变量a,inner又被外部outer给接收,回收机制检查到内部的变量被引用,就不会执行回收。
但是看到这里,还是一脸蒙比,哪里使用了闭包?貌似有三个函数呀,一个box,一个inner还有一个outer = box()。
-
这个案例中用到的闭包其实是inner和inner被定义时的词法环境,这个闭包被return出来后被外部的outer引用,因此可以在box外部执行这个inner,inner能够读取到box内部的变量a。
-
使用这个闭包的目的是为了在box外部访问a,就是通过执行outer()。