在讨论私有属性和方法的实现之前,我们先了解一下Javascript中的一个概念“闭包”
 什么是“闭包”呢?我们先来看一个例子
function Class1(){
    
var a = 10;
    
function Class2(){
        a
++;
    }
    Class2();
    
return a;
}

var class1 = new Class1();
alert(class1);
a是定义在函数Class1中私有变量,但是我们可以通过Class2访问它,这个比较好理解,但是如果我们是在Class1的外部来调用Class2呢?
function Class1(){
    
var a = 10;
    
function Class2(){
        a
++;
        
return a;
    }
    
return Class2;
}

var class1 = new Class1();
alert(class1());    
//11
alert(class1());    //12
我们可以看到它仍然能够访问变量a
从上面的例子可以看到在JavaScript函数是运行在定义他们的作用域中(本例中的Class1内部),而不是运行在调用他们的作用域中
只要Class2定义在Class1中,它就能访问Class1中所定义的所有变量
这就形成了一个“闭包”
你可能会问,这有什么用呢?,答案是“什么都可以做”
下面我们来看一个简单例子,我们都知道setTimeout函数用于延时触发函数
function aaa(){
    alert(
1+2);
}

setTimeout(aaa(),
10000);
这个例子很简单,将在10秒后弹出对话框"3"
如果,我们想让函数灵活一些,通过参数弹出相应的数字,你可能会这样写
function aaa(a,b){
    alert(a
+b);
}

setTimeout(aaa(
1,2),10000);
很不幸,这样做,不会延迟10秒,而是马上就弹出了“3”
下面我们再次改造上面的代码,我们将创建一个闭包,将要延时执行的函数放到闭包中
function aaa(a, b){
    
return (function(){
        alert(a 
+ b);
   });
}

setTimeout(aaa(
1,2),10000);
OK,这样就能延迟的执行传参的函数了
这只是使用“闭包”的一个很简单的例子,下一节,我们将使用“闭包”来创建一个有私有字段和函数的类

扩展阅读:
Javascript 闭包

参考书目:
《JavaScript权威指南》
《JavaScritp高级程序设计》
《JavaScript设计模式》
posted on 2009-08-29 12:32  滋心  阅读(298)  评论(0编辑  收藏  举报