“官方”的解释是:所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。反正我是没看懂,因为描述的太学术。直接上例子吧,
function out(){
var i=0;
function inside(){
console.log(++i);
}
return inside;
}
var o=out();
o();//1
o();//2
这段代码有两个特点:
1、函数inside嵌套在函数out内部;
2、函数out返回函数inside。
这样在执行完var o=out( )后,其中,o的值就是内部定义的函数inside,可是,多次调用o(),会在控制台输出不同的值。为什么呢?
因为inside函数创建的同时,生成了一个闭包,函数创建处的词法环境被保存到了这个闭包中。
当通过o调用这个inside函数时,函数内的变量,是到创建时的词法环境中去解析的,而不是到当前的调用环境中解析。因此,i会找到var i=0;处的i。又因为,词法环境中保存的是i的引用,所以,多次调用修改的是同一个i,因此每次调用的控制台显示的结果不同。
我的理解是,闭包就是能够读取其他函数内部变量的函数,类似于java中的作用域。
由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。
所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。