【笔记】JavaScript闭包的常见使用

自己总结出来的使用方法。。。。Mark一下!

1。循环绑定

No Use:

1 var lists = document.getElementsByTagName(‘li’);
2 for(var i=0;i<lists.length;i<l;i++){
3     lists[i].onclick=function(){alert(i);};
4 }
5 

结果:点击每一个li,都是弹出lists.length的值。

原因:onclick事件中的i值只是引用,最后循环执行完了,i = lists.length。

Use:

1 var lists = document.getElementsByTagName(‘li’);
2 for(var i=0;i<lists.length;i<l;i++){
3     lists[i].onclick=function(i){return function(){alert(i);}}(i);
4 }
5 

结果:点击每一个li,弹出对应li的编号i值。

原因:将i值传递进内部的函数中,此时函数已经执行了,所以,i这个值就是当时的值。

 

2。配置对应访问

No Use:

function getType(type){
var list = {
    ‘a’:’配置一’,
    ‘b’:’配置二’,
    ‘c’:’配置三’
}
return list[type];
}

结果:返回需要的配置值。

分析:每次调用都需要重新定义list变量以及赋值;

 Use:

 1 var getType = function(){
 2     var list = {
 3         ‘a’:’配置一’,
 4         ‘b’:’配置二’,
 5         ‘c’:’配置三’
 6 };
 7 return function(type){
 8     return list[type];
 9 };
10 }();
11 

结果:返回需要配置值。

分析:只需要定义与赋值一次list变量。

 

3。封装类

No Use:

1 function ClassA(name){
2     this.name = name;
3     this.getName = function(){
4          return this.name;
5     }
6 }

结果:正常定义需要类。

 Use:

 1 var ClassA = function(){
 2     function init(name){
 3         this.name = name;
 4         this.getName = function(){
 5         return this.name;
 6                 }
 7         }
 8 return init;
 9 }();
10 

结果:更进一步封装类。看起来优雅些。

 

4。自执行,避免全局变量污染

No Use:

1 var a = ‘1’;
2 var b = ‘2’;
3 alert(a+b);
4 

结果:弹出12。

分析:多了两个全局变量a与b。

Use:

1 ~function(){
2      var a = ‘1’;
3      var b = ‘2’;
4      alert(a+b);
5 }();
6 
 

结果:弹出12。

分析:函数执行完,变量a与b消失,不存在全局变量。

 

5。将json对象的公用函数私有化

No Use:

1 var data = {
2     getA:function(){return ‘A’},
3     getB:function(){return ‘B’},
4     p_get:function(){return this.getA()+this.getB();}
5 }
6 data.p_get();
7 
 

结果:返回’AB’。

分析:getA与getB方法,只是提供给p_get方法使用,属于私有方法,不应该变成公用方法,data.getA()也能访问得到。

Use:

 1 var data = function(){
 2     function getA(){return ‘A’};
 3     function getB(){return ‘B’};
 4     var json = {
 5         p_get:function(){return getA()+getB();}
 6         }
 7 return json;
 8 }();
 9 data.p_get();
10 
 

结果:返回’AB’;

分析:getA与getB只能在内部访问,无法通过data.getA方式访问。与第二种类似。

 

暂时就想到那么多,最后一句,可以的话,还是尽量少用闭包。

 

posted @ 2011-01-06 23:30  Floyd  阅读(1010)  评论(8编辑  收藏  举报