javascript---匿名函数和闭包

mac2022-06-30  105

匿名函数:

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

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

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 }

 

转载于:https://www.cnblogs.com/GacentJohn/p/5322919.html

最新回复(0)