使變量的值始終保持在內(nèi)存中
function f1(){
var n=999;
function f2(){
alert(n++);
}
return f2;
}
var result=f1();
result(); // 999
result(); // 1000
我們?cè)谕獠空{(diào)用result
函數(shù)暇检,可以不斷增加內(nèi)部的n值,實(shí)際上函數(shù)f1中的局部變量n一直保存在內(nèi)存中,并沒有在f1調(diào)用后被自動(dòng)清除酿矢。
原因: f1是f2的父函數(shù),而f2被賦給了一個(gè)全局變量蜜暑,這導(dǎo)致f2始終在內(nèi)存中策肝,而f2的存在依賴于f1之众,因此f1也始終在內(nèi)存中,不會(huì)在調(diào)用結(jié)束后棺禾,被垃圾回收機(jī)制(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 并不提供原生的支持缺前,但是可以使用閉包模擬私有方法
使用閉包的注意點(diǎn)
- 由于閉包會(huì)使得函數(shù)中的變量都被保存在內(nèi)存中蛀醉,內(nèi)存消耗很大,所以不能濫用閉包衅码,否則會(huì)造成網(wǎng)頁的性能問題拯刁,在IE中可能導(dǎo)致內(nèi)存泄露。解決方法是逝段,在退出函數(shù)之前垛玻,將不使用的局部變量全部刪除。