闭包的作用有:
- 封装私有变量
function base() {
let name = 'zl';
return {
sayName() {
return name;
}
}
}
let obj = base();
console.log(obj.sayName()); // zl
- 模仿块级作用域(ES5中没有块级作用域)
var a = [];
for(var i=0; i<10; i++) {
a[i] = (function(j) {
return function() {
console.log(j);
}
})(i);
}
a[6](); // 6
- 实现JS的模块
function base() {
let age = 25;
let name = 'zl';
function sayName() {
console.log(name);
};
function sayAge() {
console.log(age);
};
return {
sayAge,
sayName
}
}
let info = base();
info.sayAge();
info.sayName();
模块模式具有两个必备的条件(来自《你不知道的JavaScript》)
- 必须有外部的封闭函数,该函数必须至少被调用一次(每次调用都会创建一个新的模块实例);
- 封闭函数必须返回至少一个内部函数,这样内部函数才能在私有作用域中形成闭包,并且可以访问或者修改私有的状态。