0
点赞
收藏
分享

微信扫一扫

闭包原理个人理解

function A(){
    var s=10;
    function B(){
      alert(s);
    }
    return B;
  }
  var result=A();
  result(); // 10

B函数,就是闭包。如果一个函数访问了它的外部变量,那么它就是一个闭包。

特性:

1、定义在一个函数内部的函数

2、能够读取其他函数内部变量的函数

3、可以将函数内部和函数外部连接起来

作用(用途):

1、避免全局变量污染

2、匿名自执行函数

var data= {    
table : [],
tree : {}
};

(function(dm){
for(var i = 0; i < dm.table.rows; i++){
var row = dm.table.rows[i];
for(var j = 0; j < row.cells; i++){
drawCell(i, j);
}
}

})(data);

3、封装

var person = function(){    
//变量作用域为函数内部,外部无法访问
var name = "default";

return {
getName : function(){
return name;
},
setName : function(newName){
name = newName;
}
}
}();

print(person.name);//直接访问,结果为undefined
print(person.getName());
person.setName("abruzzi");
print(person.getName());

得到结果如下:

undefined
default
abruzzi

 

4、实现类和继承

function Person(){    
var name = "default";

return {
getName : function(){
return name;
},
setName : function(newName){
name = newName;
}
}
};

var p = new Person();
p.setName("Tom");
alert(p.getName());

var Jack = function(){};
//继承自Person
Jack.prototype = new Person();
//添加私有方法
Jack.prototype.Say = function(){
alert("Hello,my name is Jack");
};
var j = new Jack();
j.setName("Jack");
j.Say();
alert(j.getName());

 

5、结果缓存

var CachedSearchBox = (function(){    
var cache = {},
count = [];
return {
attachSearchBox : function(dsid){
if(dsid in cache){//如果结果在缓存中
return cache[dsid];//直接返回缓存中的对象
}
var fsb = new uikit.webctrl.SearchBox(dsid);//新建
cache[dsid] = fsb;//更新缓存
if(count.length > 100){//保正缓存的大小<=100
delete cache[count.shift()];
}
return fsb;
},

clearSearchBox : function(dsid){
if(dsid in cache){
cache[dsid].clearSelection();
}
}
};
})();

CachedSearchBox.attachSearchBox("input");

 



举报

相关推荐

0 条评论