閉包的用途
1)緩存:在項目中有些變量的值會在多出用到,如果直接把變量定義成全局變量也能解決問題,但是危險很大,因為可能發生變量重名的問題,這樣有可能出現潛在的bug。那麼用閉包做一個專門用於存放變量的緩存,就可以解決這個問題。
例子:
//CachedSearchBox就是一個存放變量的工具
var CachedSearchBox = (function(){
var cache = {};
count = [];
return {
getCache : function(dsid){
if(dsid in cache) {
return cache[dsid];
}
},
setCache : function(dsid,data){
cache[dsid] = data;
}
}
})();
var a = [1,2,3,4,5];
CachedSearchBox.setCache('a',a);//可以把變量存放在cache中
console.info(CachedSearchBox.getCache('a'));//在需要的地方直接拿出來就行
CachedSearchBox.setCache('a',['a','b','c','d']);
console.info(CachedSearchBox.getCache('a'));
2)實現封裝
閉包的另一個重要用途是實現面向對象中的對象,傳統的對象語言都提供類的模板機制,這樣不同的對象(類的實例)擁有獨立的
成員及狀態,互不干涉。雖然JavaScript中沒有類這樣的機制,但是通過使用閉包,我們可以模擬出這樣的機制。
function Person(){
var name = "default";
return {
getName : function(){
return name;
},
setName : function(newName){
name = newName;
}
}
};
var john = Person();
console.info(john.getName());
john.setName("john");
console.info(john.getName());
var jack = Person();
console.info(jack.getName());
jack.setName("jack");
console.info(jack.getName());
運行結果如下:
default
john
default
jack