闭包
2017-07-02 本文已影响0人
Liberty寒风
使变量的值始终保持在内存中
function f1(){
var n=999;
function f2(){
alert(n++);
}
return f2;
}
var result=f1();
result(); // 999
result(); // 1000
我们在外部调用result
函数,可以不断增加内部的n值,实际上函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。
原因: f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。
用闭包模拟私有方法
var Counter = (function() {
var privateCounter = 0;
function changeBy(val) {
privateCounter += val;
}
return {
increment: function() {
changeBy(1);
},
decrement: function() {
changeBy(-1);
},
value: function() {
return privateCounter;
}
}
})();
alert(Counter.value()); /* 提示 0 */
Counter.increment();
Counter.increment();
alert(Counter.value()); /* 提示 2 */
Counter.decrement();
alert(Counter.value()); /* 提示 1 */
JavaScript 并不提供原生的支持,但是可以使用闭包模拟私有方法
使用闭包的注意点
- 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。