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//正确了!

      以上所写纯属个人意见,如有错误,请给与改正!谢谢。