1.1 闭包定义
函数的AO通过scope chain相互连接起来,使得函数体内的变量都可以保存在函数的AO,这样的特性称为“闭包”。
1.2 闭包举例
1.2.1 代码
function outer(){
var scope = 'outer';
function inner(){
return scope;
}
return inner;
}
var fn = outer();
console.log(fn()); // outer
1.2.2 分析
- 见紫色部分:运行结束由于
fn指向了inner,inner拿着scope chain2的拷贝、所以outer的AO没有释放
1.2 闭包的用途
1.2.1 实现公有变量,例如:累加器
function add(){
var count = 0;
function addAction(){
count++;
console.log(count);
return count;
}
return addAction;
}
var myAdd = add();
myAdd();
myAdd();
myAdd();
1.2.2 缓存存储结构
function add(){
var count = 0;
function addAction(){
count++;
console.log(count);
return count;
}
function clearAction(){
count = 0;
console.log(count);
return count;
}
return [addAction, clearAction];
}
var myAdd = add();
myAdd[0]();
myAdd[0]();
myAdd[0]();
myAdd[0]();
myAdd[1]();
myAdd[0]();
myAdd[0]();
1.2.3 封装,使用方法操作变量,实现属性私有化
function counter(){
var count = 0;
var adder = {
addAction: function(){
count++;
console.log(count);
return count;
},
clearCount: function(){
count = 0;
console.log(count);
return count;
}
};
return adder;
}
var myCounter = counter();
myCounter.addAction();
myCounter.addAction();
myCounter.addAction();
myCounter.addAction();
myCounter.clearCount();
myCounter.addAction();
myCounter.addAction();
1.3 闭包的缺点
- 闭包会造成原有的AO不释放,产生内存泄漏(非正规的内存占用)