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

循环问题中索引求解

循环问题中索引求解

for(var i= 0,len = oLis.length;i<len;i++){                 oLis[i].index=i;                 oLis[i].onclick = function() {                     for(var n= 0;n<len;n++){                         oLis[n].className = "";                         oDivs[n].className = "hide";                     }                     this.className = "on";                     oDivs[this.index].className = "";                 }             };为什么要用到索引?直接这样为什么不行?for(var i= 0,len = oLis.length;i<len;i++){                 oLis[i].onclick = function() {                     for(var n= 0;n<len;n++){                         oLis[n].className = "";                         oDivs[n].className = "hide";                     }                     this.className = "on";                     oDivs[i].className = "";                 }             };
查看完整描述

1 回答

?
堂堂堂堂糖糖糖童鞋

TA贡献101条经验 获得超58个赞

你可以自己尝试分析一下执行过程。
这里我说一下,先进行遍历,同时为oLis[i]绑定点击事件监听,
然而,for循环执行完毕后,点击事件并未出发,而i的值变为oLis.length,因为i为全局作用域变量

当我们触发点击事件时,执行回调函数,此时是执行的是

oLis[i].onclick = function() {
    //此时i已经变为了oLis.length
     oDivs[oLis.length].className = "";
},

所以,需要保存当前遍历添加监听元素的下标到元素的index属性中,方便在之后查找到对应得元素。

可以这样写:

for(var i= 0,len = oLis.length;i<len;i++){
      (function(i){//IIFC(即时执行函数,并隔离i的作用域)
           oLis[i].onclick = function() {
                     for(var n= 0;n<len;n++){
                         oLis[n].className = "";
                         oDivs[n].className = "hide";
                     }
                     this.className = "on";
                     oDivs[i].className = "";
                 }
      })(i)
 };

ES6的话:

for(let i= 0,len = oLis.length;i<len;i++){//块级作用域声明let,存在兼容性,了解即可
       oLis[i].onclick = function() {
            for(var n= 0;n<len;n++){
                 oLis[n].className = "";
                 oDivs[n].className = "hide";
             }
             this.className = "on";
             oDivs[i].className = "";
        }
 };


查看完整回答
反对 回复 2016-10-12
  • 1 回答
  • 0 关注
  • 1047 浏览
慕课专栏
更多

添加回答

举报

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