码迷,mamicode.com
首页 > 其他好文 > 详细

循环在闭包里的问题(写的不一定正确纯属阐述个人理解)

时间:2015-10-09 21:12:09      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:

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

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

 

循环在闭包里的问题(写的不一定正确纯属阐述个人理解)

标签:

原文地址:http://www.cnblogs.com/millent/p/4865031.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!