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

求助,关于for循环中的函数

 for(var i= 0,len = xli.length;i<len;i++){

xxx(i);

}

function xxx(i){

xli[i].onclick=function(){

for(var n= 0;n<len;n++){

                         xli[n].className = "";

                         xDivs[n].className = "cont";

}

xli[i].className = "on";

xDivs[i].className="";

   }

}

如上代码是可行的。但是将xxx这个函数替换掉xxx(i)位置就不可行了。什么原因呢?

正在回答

4 回答

for(var i= 0,len = xli.length;i<len;i++){

   xli[i].onclick=function(){

       for(var n= 0;n<len;n++){

           xli[n].className = "";

           xDivs[n].className = "cont";

       }

       xli[i].className = "on";

       xDivs[i].className="";

   }

}这是你想改成的代码吧


先说一下for循环的时候做了什么吧,给每一个li绑定了一个onclick事件,然后for循环就结束了


,到这里一切都正常


问题出在onclick触发时,


xli[i].className = "on";


xDivs[i].className="";


执行上述2个语句,i是多少,由于本身onclick事件绑定的匿名函数里没有i的相关定义,按照作


用域链,向上一级查找i,这时在for循环里找到i的定义,此时i是多少呢,由于for循环早就跑完


了,onclick事件也早绑完了,所以i是len-1,到此,就错误了。


那么提问那种方法为什么没错,因为把i作为参数,在传参的过程中给保存了,每一个li对应的i


值都被保存了,保存在函数xxx的参数i里,防止2个i你分不清楚,我给改写一下你看的明白。


function xxx(obj){//参数obj保存了当时i的值


xli[i].onclick=function(){//绑定事件时,i向上从for循环里取当时的i值


for(var n= 0;n<len;n++){


                         xli[n].className = "";


                         xDivs[n].className = "cont";


}


xli[obj].className = "on";//触发事件后,找obj的值,向上一级查找,找到参数obj,值为当时i的



xDivs[obj].className="";



   }


到此,就是说,想要不出现i值错误,就要保存一下i值,上面那种作为参数保存是一种,标准答


案提供的是另一种


for(var i= 0,len = xli.length;i<len;i++){

   xli[i].obj=i;//给li自定义了一个obj属性,保存当时的i值,每一个li都有一个obj属性,来


保存对应的i值

  xli[i].onclick=function(){

       for(var n= 0;n<len;n++){

           xli[n].className = "";

          xDivs[n].className = "cont";

      }

       this.className = "on";//this为触发onclick的li

       xDivs[this.obj].className="";//this.obj值为触发onclick的li当时的i值

  }

}


还有很多种方法,比如i值保存在函数属性里,比如i值保存在一个局部变量里,重点都在于把每


个li对应的i值给保存住,js有一个重要知识点叫做闭包,也可以用来保存i值,这里不做多讲,


可以自己查询了解一下。


2 回复 有任何疑惑可以回复我~
#1

Original121 提问者

非常感谢!for循环跑完后i应该等于len吧?
2016-05-03 回复 有任何疑惑可以回复我~
#2

kuban 回复 Original121 提问者

for内最后一个i是len-1,出去就是len了 for循环,满足第二条件执行花括号内内容,执行完毕i再加1,所以最后一个for花括号内的i值是len-1,执行完毕时是len,不符合for循环第二条件,不再进入循环,下面附一小段代码,可以给你自己尝试一下看值。
2016-05-03 回复 有任何疑惑可以回复我~

这时在for循环里找到i的定义,此时i是多少呢,由于for循环早就跑完


了,onclick事件也早绑完了,所以i是len-1,到此,就错误了。

就是这句话,不是很明白。。。

0 回复 有任何疑惑可以回复我~

for(var i= 0,len = xli.length;i<len;i++){

   xli[i].onclick=function(){

       for(var n= 0;n<len;n++){

           xli[n].className = "";

           xDivs[n].className = "cont";

       }

       xli[i].className = "on";

       xDivs[i].className="";

   }

}这是你想改成的代码吧

这个i并没有执行完吧,都是从0开始的呀。xli[0],xli[1]....依次往后的呀

0 回复 有任何疑惑可以回复我~

<!DOCTYPE html>
<html>
<head lang="en">
   <meta charset="UTF-8">
   <title></title>
</head>
<body>
for循环内的i值:<input class="f1" /><br>
for循环外的i值:<input class="f2" />
<script>
   (function a(){
       for(var i=0;i<5;i++)
       {
           var f1=document.getElementsByClassName("f1");
           f1[0].value=i;
       }
       var f2=document.getElementsByClassName("f2");
       f2[0].value=i;
   })();
</script>
</body>
</html>

0 回复 有任何疑惑可以回复我~
#1

Original121 提问者

嗯,thank you
2016-05-03 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
JavaScript进阶篇
  • 参与学习       468189    人
  • 解答问题       21891    个

本课程从如何插入JS代码开始,带您进入网页动态交互世界

进入课程

求助,关于for循环中的函数

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信