标签:
★★★★来看一个经典的例子
1 //想实现的是 arr[0]=0,arr[1]=1,arr[2]=2...arr[4]=4 2 function box() 3 { 4 var arr=[]; 5 6 for(var i=0; i<5; i++) 7 { 8 arr[i]=function() 9 { 10 return i; 11 }; 12 } 13 14 //循环已经执行完毕, i最终是4++ =>5 , 那么最终是5 15 //那么你再从里面调用 每个匿名函数的i 那必然是5 16 return arr; //★这里很重要 我们返回出的是 已经循环结束的i 17 } 18 19 var b =box(); 20 21 for(var i=0; i<5; i++) 22 { 23 alert(b[i]()); //=>5,5,5,5,5 24 }
★修改1
1 function box() 2 { 3 var arr = []; 4 for(var i=0; i<5; i++) 5 { 6 arr[i]=(function(num) //通过自我及时 执行匿名函数 7 { 8 return num; 9 })(i); 10 } 11 return arr; 12 } 13 14 var b=box(); 15 for(var i=0; i<5; i++) 16 { 17 alert(b[i]); //这里的是b[i] 18 }
★修改2
1 function box() 2 { 3 var arr = []; 4 for(var i=0; i<5; i++) 5 { 6 arr[i]=(function(num) 7 { 8 //num其实在这里 9 return function() 10 { 11 return num; //因为闭包可以将变量驻留在内存中,和上面的累加是一样的 12 } 13 })(i); 14 } 15 //已经执行完毕了,num为什么可以0,1,2,3,4 16 return arr; 17 } 18 19 var b=box(); 20 //console.log(b); 21 for(var i=0; i<5; i++) 22 { 23 alert(b[i]()); 24 }
看一个小技巧
1 var b=function() 2 { 3 alert(‘Lee‘); 4 }(i) 5 6 //所以改2的循环是可以改成 如下 7 arr[i]=function(num) 8 { 9 return function() 10 { 11 return num; 12 } 13 }(i);
标签:
原文地址:http://www.cnblogs.com/VanqusherCsn/p/4316419.html