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 cat=box(); 11 for(var i=0;i<5;i++){ 12 alert(cat[i]()); 13 }
看上面一段代码,总体看来alert(cat[i]());会分别输出0,1,2,3,4;其实不然,输出的全是5;
这时我们会产生疑问,为什么输出是5?没道理啊?让我们看下面的小代码:
var box=function(){ return "你好"; } alert(box);//这里的谁输出代码表达式,类型function alert(box());//这里会是输出结果:你好,类型function
上面所写,牵扯到运行与不运行的问题。
alert(box);只是简单传递表达式,
alert(box());则是运行代码
再看下一段代码
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 cat=box(); 11 for(var i=0;i<5;i++){ 12 alert(cat[i]()); 13 }
第4行代码正是只传递了代码代码段,所以当循环执行完毕,每一个i保存了这样一段代码
function(){ return i; }
而i的值 就是循环后的i=(4++=5);
所以每一个i的值就为5;
但是我们怎样改进呢?让我们看这样一段代码
1 var box=(function(){ 2 return "你好"; 3 })(); 4 alert(box);//输出:你好
我们知道上面这样一种写法会自动运行代码,所以不会输出代码代码段。所以我们可以这样写
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 cat=box(); 11 for(var i=0;i<5;i++){ 12 alert(cat[i]); 13 }
输出0,1,2,3,4//正确了!
以上所写纯属个人意见,如有错误,请给与改正!谢谢。
时间: 2024-10-11 06:56:03