为了账号安全,请及时绑定邮箱和手机立即绑定

麻烦大家帮忙看看,关于javascript的问题

麻烦大家帮忙看看,关于javascript的问题

ZXJ03 2017-04-14 22:53:51
例:function box{ var arr=[]; for(var i=0;i<5;i++){     arr[i]=function(){         return i;         };     }     return arr; } var b=box(); for(var i=0;i<5;i++){     alert(b[i]()); } 为什么这个打印出来的是55555 而下面这个 function box{ var arr=[]; for(var i=0;i<5;i++){     arr[i]=(function(num){         return function(){             return num;             }         })(i);     }     return arr; } var b=box(); for(var i=0;i<5;i++){     alert(b[i]); } 这个打印出来的结果是0,1,2,3,4
查看完整描述

3 回答

?
ruibin

TA贡献358条经验 获得超213个赞

第一个是闭包问题,第二个是由于alert会阻断程序的运行
查看完整回答
反对 回复 2017-04-15
?
学海无涯乐悠悠

TA贡献4条经验 获得超0个赞


1.第一行 ;function box{}应该是function box();属于手误。
2.第一个问题,为什么打印出来是55555:因为box()返回一个数组-arr,arr[0]=function(){return i},........arr[4]=function(){return i}。i的值一直被引用,并没有被垃圾回收(renturn i还在引用),理解为box对象的私有变量。循环完i=5;所以不管是arr[0]()=5,......还是到arr[4]()都=5;注意在循环的过程中arr[0]()=0,arr[1]()=1。因为循环过程中i的值是从0到4.

接下来b=box(),循环调用b[0]().......b[4]();输出仍然一直为5;

3.第二个问题,比较容易理解,调用box()返回一个数组,内容为arr[0]=0,arr[1]=1,.....arr[4]=4;下面遍历输入自然是0,1,2,3,4。

查看完整回答
反对 回复 2017-04-15
?
慕粉4075985

TA贡献104条经验 获得超33个赞

一两句说不清,详情百度 闭包
查看完整回答
反对 回复 2017-04-15
  • 3 回答
  • 0 关注
  • 1744 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信