在讨论私有属性和方法的实现之前,我们先了解一下Javascript中的一个概念“闭包”
什么是“闭包”呢?我们先来看一个例子
从上面的例子可以看到在JavaScript函数是运行在定义他们的作用域中(本例中的Class1内部),而不是运行在调用他们的作用域中
只要Class2定义在Class1中,它就能访问Class1中所定义的所有变量
这就形成了一个“闭包”
你可能会问,这有什么用呢?,答案是“什么都可以做”
下面我们来看一个简单例子,我们都知道setTimeout函数用于延时触发函数
如果,我们想让函数灵活一些,通过参数弹出相应的数字,你可能会这样写
下面我们再次改造上面的代码,我们将创建一个闭包,将要延时执行的函数放到闭包中
这只是使用“闭包”的一个很简单的例子,下一节,我们将使用“闭包”来创建一个有私有字段和函数的类
扩展阅读:
Javascript 闭包
参考书目:
《JavaScript权威指南》
《JavaScritp高级程序设计》
《JavaScript设计模式》
什么是“闭包”呢?我们先来看一个例子
function Class1(){
var a = 10;
function Class2(){
a++;
}
Class2();
return a;
}
var class1 = new Class1();
alert(class1);
a是定义在函数Class1中私有变量,但是我们可以通过Class2访问它,这个比较好理解,但是如果我们是在Class1的外部来调用Class2呢?var a = 10;
function Class2(){
a++;
}
Class2();
return a;
}
var class1 = new Class1();
alert(class1);
function Class1(){
var a = 10;
function Class2(){
a++;
return a;
}
return Class2;
}
var class1 = new Class1();
alert(class1()); //11
alert(class1()); //12
我们可以看到它仍然能够访问变量avar a = 10;
function Class2(){
a++;
return a;
}
return Class2;
}
var class1 = new Class1();
alert(class1()); //11
alert(class1()); //12
从上面的例子可以看到在JavaScript函数是运行在定义他们的作用域中(本例中的Class1内部),而不是运行在调用他们的作用域中
只要Class2定义在Class1中,它就能访问Class1中所定义的所有变量
这就形成了一个“闭包”
你可能会问,这有什么用呢?,答案是“什么都可以做”
下面我们来看一个简单例子,我们都知道setTimeout函数用于延时触发函数
function aaa(){
alert(1+2);
}
setTimeout(aaa(),10000);
这个例子很简单,将在10秒后弹出对话框"3"alert(1+2);
}
setTimeout(aaa(),10000);
如果,我们想让函数灵活一些,通过参数弹出相应的数字,你可能会这样写
function aaa(a,b){
alert(a+b);
}
setTimeout(aaa(1,2),10000);
很不幸,这样做,不会延迟10秒,而是马上就弹出了“3”alert(a+b);
}
setTimeout(aaa(1,2),10000);
下面我们再次改造上面的代码,我们将创建一个闭包,将要延时执行的函数放到闭包中
function aaa(a, b){
return (function(){
alert(a + b);
});
}
setTimeout(aaa(1,2),10000);
OK,这样就能延迟的执行传参的函数了return (function(){
alert(a + b);
});
}
setTimeout(aaa(1,2),10000);
这只是使用“闭包”的一个很简单的例子,下一节,我们将使用“闭包”来创建一个有私有字段和函数的类
扩展阅读:
Javascript 闭包
参考书目:
《JavaScript权威指南》
《JavaScritp高级程序设计》
《JavaScript设计模式》