javascript循环不能正确输出i值的问题。

  对于javascript的循环取值是每个开发者都遇到过的问题,例如,下面这个例子我们并不能得到想要的结果:

<body>
 <ul>
    <li>fas</li>
    <li>sf</li>
    <li>fas</li>
    <li>sf</li>
    <li>sf</li>
 </ul>
 <script type="text/javascript">
 <!--
 window.onload=function(){
     var lis=document.getElementsByTagName('li');
     var i,len=lis.length;
     for ( i=0;i<len ;i++ )
      {
        //alert(i);                                  // 依次为0,1,2,3,4
            lis[i].onclick=function(){
            alert(i);                                           //5
            }
   }
</body>

  我们是希望点击每一个li标签都显示它自己的索引值,但由于内部函数调用时外部的 i 时,i 已经循环完毕,值为5,所以不能正确输出,更详细的解释在于此时onclick函数时一个闭包函数,每次引用的时外部函数的最后一个变量。

关于解决放法,有很多中,在此介绍下我自己常用的吧:

方法一:将循环中的 i 值设置为事件对象的属性,在上面的例子中,事件对象就是lis[i];
window.onload=function(){
     var lis=document.getElementsByTagName('li');
     var i,len=lis.length;
     for ( i=0;i<len ;i++ )
      {
         lis[i].index=i;
        lis[i].onclick=function(){
            alert(this.index);    
        }
      }
方法二:外层加一个立即调用的匿名函数;
window.onload=function(){
     var lis=document.getElementsByTagName('li');
     var i,len=lis.length;
     for ( i=0;i<len ;i++ )
      {
        (function(e){
            lis[i].onclick=function(){
                    alert(e);  }  
         })(i);
 }

  此时每次调用onclick函数时,传入的参数时外层函数的e,也就时逐个传入的 i 值。

方法三:仍然选择使用匿名函数
 for ( i=0;i<len ;i++ )
      {
        lis[i].onclick=(function(arg){
            return function(){
                alert(arg); } 
            })(i);
}

原理同上,事件函数调用时调用的值arg是外层函数的arg,此值是逐个又i传入的!

方法四:Function方法
 for ( i=0;i<len ;i++ )
      {
        lis[i].onclick=new Function("alert(" + i + ");");   //每次都会出new一个新函数
    }
方法五:ES6的let方法;
for( let i=0;i<len; i++ ) {       
         lis[i].onclick = function() {       
             alert(i);       
        }     
}

低版本浏览器会报错

好了,以上就是个人总结的取循环中i值的一些方法,希望能对大家有帮助!

本文参考博客:http://blog.csdn.net/u013084331/article/details/50716467

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值