关于javascript的闭包了解多少


javascript的闭包

封装和信息隐藏直接的关系应该算是同一个意思不同的表述方式吧,在java中使用private来实现一个变量某一个method只能在 内部使用,在javasciprt中并没有该关键字,只能使用另一个概念,闭包来实现,说闭包之前先说一下javascript的三种创建对象的方式。 
如有一下java代码: 

Java代码  

1. public class User{  

2. private String id;  

3. private String name;  

4. //get set   

5. }  

6. 创建一个User对象  

7. User u = new User("1","小明");  


使用javascript创建一个User对象第一种方式,名其名曰门户大开型,最简单,最直接的一种方式,只提供公共的变量 

Javascript代码  

1. var User = function(id,name){  

2.  this.id=id;  

3.  this.name=name;  

4. }  

5. //创建一个User对象  

6. var User = new User('1','小明');  


第二种方式,命名规范区别私有成员,即提供get set 私有变量通过_开头 

Javascript代码  

1. var User = function(id,name){  

2.     this.setId(id);  

3.     this.setName(name);  

4. }  

5. User.prototype={  

6.     setId : function(id){  

7.         this._id=id  

8.     },  

9.     getId : function{  

10.         return this._id;  

11.     },  

12.     getName : function(){  

13.         return this._name;  

14.     },  

15.     setName:function(name){  

16.         this._name=name;  

17.     }  

18. }  

19. //创建一个User对象  

20. var User = new User('1','小明');  


以上两种方式其实差不多的,都存在一个问题就是可以直接通过对象点属性的方式改变属性的值,其实并没有完成私有化变量 
下面讲解第三中方式通过闭包的方式 

Javascript代码  

1. var User = function(id,name){  

2.     //直接声明两个变量,这两个变量的作用域只是在这个函数体之中所以外界是不能访问的  

3.     var _id,_name;  

4.     this.setId = function(id){  

5.         _id=id  

6.     },  

7.     this.getId = function(){  

8.         return _id;  

9.     },  

10.     this.getName = function(){  

11.         return _name;  

12.     },  

13.     this.setName=function(name){  

14.         _name=name;  

15.     }  

16.     this.setId(id);  

17.     this.setName(name);  

18. }  


发现没有?这种方式外界就无法直接通过对象点属性的方式修改了 
静态函数的创建,其实也和闭包相关的只需要将第三种方式进行改写 

Java代码  

1. var User = (function(id,name){  

2.           

3.         //此处的方法只会存在一个,无论你创建多少个User   

4.                 //private方法 外界无法访问  

5.         function show(){  

6.             //...  

7.         }  

8.   

9.   

10.     return function(id,name){  

11.         //私有属性  

12.         var _id,_name;  

13.     this.setId = function(id){  

14.         _id=id  

15.     },  

16.     this.getId = function(){  

17.         return _id;  

18.     },  

19.     this.getName = function(){  

20.         return _name;  

21.     },  

22.     this.setName=function(name){  

23.         _name=name;  

24.     }  

25.     this.setId(id);  

26.     this.setName(name);  

27.     }  

28. })();