闭包的用途
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