前面实现了一个简单的闭包。人们不禁会疑惑,难道闭包仅仅只是用来返回一个函数,然后能够访问其父函数的局部变量?
当然不是,闭包还能实现其他强大的功能。
在面向对象的程序设计语言里,比如Java和C++,要在对象内部封装一个私有变量,可以用private修饰一个成员变量。
在没有class机制,只有函数的语言里,借助闭包,同样可以封装一个私有变量。
function Person(){
var name = "default";
return {
getName: function(){
return name;
},
setName: function(newName){
name = newName;
}
}
}
var person1 = Person();
console.log(person1.name);//undefined
console.log(person1.getName());//"default"
person1.setName("jack");
console.log(person1.getName());//"jack"
var person2 = Person();
console.log(person2.name);//undefined
console.log(person2.getName());//"default"
person2.setName("rose");
console.log(person2.getName());//"rose"
即实现了内部变量的封装(只能通过闭包的形式访问);又实现了面向对象中,不同对象的实例,拥有不同的成员和状态,互不干涉。person1和person2都可以称为是Person这个类的实例,因为这两个实例对name这个成员的访问是独立的,互不影响的。(每个对象都有独立的方法,那n个对象,就会有n个独立的方法,即使方法实现方法相同,性能啊!内存啊!)
使用闭包,需要注意的地方。
1、从上一篇,我们可以知道,闭包使得函数中的变量(上一篇文章中的tmp变量)一直保持在内存中(至于为什么会一直在内存中,后面会介绍)。使变量一直在内存中,复杂的运算和逻辑可能会导致内存消耗过大,造成性能问题,也有可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2、闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部的值。
浙公网安备 33010602011771号