javascript---匿名函数和闭包

匿名函数:

• 单独的匿名函数是无法运行的,就算运行也无法调用,因为没名称

所以:下面有五种方式使用匿名函数

1.把匿名函数赋值给变量

1     var box=function(){
2         return 'Lee';
3     }
4     alert(box());

2.通过自我执行来执行函数

1     (function(){                    //(匿名函数)()    ,第一个括号是匿名函数,第二个是执行
2         alert('Lee');
3     })();

3.把匿名函数自我执行的返回值赋值给变量

1     var box=(function(){
2         return 'Lee';
3     })();
4     alert(box);

4.自我执行的匿名函数的传参

1     (function(age){
2         alert(age);
3     })(100);

5.函数里面放一个匿名函数

1     function box(){
2         return function(){                //闭包
3             return 'Lee';
4         }
5     }
6     alert(box()());

 


 

上面的第五种情况就形成了我们下面要讲的闭包

闭包:有权访问另一个函数作用域中变量的函数

创建方式:就是在一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量

使用:

1.通过闭包返回局部变量

1     function box(){
2         var age=100;
3         return function(){
4             return age;
5         }
6     }
7     alert(box()());    //100

 

2.使用匿名函数实现局部变量驻留内存中从而累加

 1     function box(){
 2         var age=100;
 3         return function(){
 4             age++;
 5             return age;
 6         }
 7     }
 8     var b=box();            //提倡
 9     alert(b());                //101
10     alert(b());                //102
11     alert(b());                //103
12     b=null;                    //防止占用内存

 

例题:循环里的匿名函数的取值问题

 1     function box(){
 2         var arr=[];
 3         for(var i=0;i<5;i++){
 4             arr[i]=function(){
 5                 return i;
 6             }
 7         }
 8         return arr;
 9     }
10     var b=box(); 
11     for(var i=0;i<5;i++){
12         alert(b[i]());                
13     }

觉得最后打印是什么?

答案是:

五个5!!!

解答:

循环在b=box()的时候已经执行完毕,最终i=5;但是匿名函数function(){return i} 还没执行,然后b[i]()循环中调用里面的匿名函数时候(不再重新调用box()),return i就是5;

 

改进:采用匿名函数的自执行

 1     function box(){
 2         var arr=[];
 3         for(var i=0;i<5;i++){
 4             arr[i]=(function(i){
 5                 //i其实在这里
 6                 return function(){
 7                     return i;
 8                 };
 9             })(i);
10         }
11         return arr;
12     }
13     var b=box(); 
14     for(var i=0;i<5;i++){
15         alert(b[i]());                //0,1,2,3,4
16     }

 

posted @ 2016-03-26 14:45  GacentJohn  阅读(158)  评论(0编辑  收藏  举报