匿名函数:
• 单独的匿名函数是无法运行的,就算运行也无法调用,因为没名称
所以:下面有五种方式使用匿名函数
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 }