您的位置:首页 > Web前端 > JavaScript

js 闭包

2015-06-03 22:57 736 查看
通过使用闭包,可以模拟面向对象的代码风格,在某些方面提高代码的效率。

用途:

1、 匿名自执行函数

变量不加var,默认当作全局变量。这样可能造成别的地方误用该变量,全局变量过多,影响访问速度(因为变量取值需要遍历原型链)。

还有某些函数只需要执行一次,其内部变量无需维护,可以使用闭包。如初始化这种函数:

var datamodel = {
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);
}
}

//build dm.tree
})(datamodel);


我们创建了一个匿名的函数,并立即执行它,由于外部无法引用它内部的变量,

因此在执行完后很快就会被释放,关键是这种机制不会污染全局对象。

2、封装

可以先来看一个关于封装的例子,在person之外的地方无法访问其内部的变量,而通过提供闭包的形式来访问:

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


3、实现面向对象中的对象

不同的对象(类的实例)拥有独立的成员及状态,互不干涉。虽然JavaScript中没有类这样的机制,但是通过使用闭包,

我们可以模拟出这样的机制。还是以上边的例子来讲:

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

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

var john = Person();
print(john.getName());
john.setName("john");
print(john.getName());

var jack = Person();
print(jack.getName());
jack.setName("jack");
print(jack.getName());

运行结果如下:

default
john
default
jack


由此代码可知,john和jack都可以称为是Person这个类的实例,因为这两个实例对name这个成员的访问是独立的,互不影响的。

转自: http://blog.csdn.net/sunlylorn/article/details/6534610
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  闭包