1.源于js的一条规则:函数内部可以直接读取全局变量,但是在函数外部无法读取函数内部的局部变量。
2.为了解决问题1,利用js的另一个特点:"链式作用域"结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。可以在函数F1里面声明一个函数F2,这样函数F2就被包括在函数F1内部,这时F1内部的所有局部变量,对F2都是可见的。既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们不就可以在f1外部读取它的内部变量了吗!
3.由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
4.封装
var people = function() {}(
//变量作用域为函数内部,外部无法访问
var name = "defalut";
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
5.实现类和继承
function Person(){
varname = "default";
return {
getName : function(){
return name;
},
setName : function(newName){
name = newName;
}
}
};
varp =new Person();
p.setName("Tom"); alert(p.getName());
varJack =function(){};
//继承自PersonJack.prototype =new Person();
//添加私有方法Jack.prototype.Say =function(){
alert("Hello,my name is Jack");
};
varj =new Jack();
j.setName("Jack");
j.Say();
alert(j.getName());
我们定义了Person,它就像一个类,我们new一个Person对象,访问它的方法。
下面我们定义了Jack,继承Person,并添加自己的方法
网友评论