全面理解Javascript闭包和闭包的几种写法及用途?

var Circle={

"PI":3.14159,

"area":function(r){

return this.PI * r * r;

}

};

alert( Circle.area(1.0) );

匿名自执行函数

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);

结果缓存[闭包正是可以做到这一点,因为它不会释放外部的引用,从而函数内部的值可以得以保留。]

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");

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());

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());

来源:http://www.cnblogs.com/yunfeifei/p/4019504.html