「函数」和「函数内部能访问到的变量」(也叫环境)的总和,就是一个闭包。
var add = (function () {
var counter = 0;
return function () {return counter += 1;}
})();
// 此时,执行了自调用函数(立即执行,只执行一次),
// 变量add被赋值function () {return counter += 1;}
// add 此时变成了函数,可以操作外层函数的变量counter
add();
add();
add();
// 计数器目前是 3
看起来类似于实现一个类,外层函数相当于类的声明,counter相当于属性声明,内层函数相当于属性的getter方法,只是return后外面可直接使用。立即执行函数相当于类的实例化。
为什么要函数套函数呢?
是因为需要局部变量,所以才把 counter 放在一个函数里,如果不把 counter 放在一个函数里,counter 就是一个全局变量了,达不到使用闭包的目的——隐藏变量。
为什么要 return function () {return counter += 1;} 呢?
因为如果不 return,你就无法使用这个闭包。
闭包的作用
闭包常常用来「间接访问一个变量」。换句话说,「隐藏一个变量」。