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

为什么把this换成oList[i]就不行?

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 = "li1";

        oDivs[this.index].className = "";

       }

    };


正在回答

3 回答

  因为页面一旦加载完成就触发onload事件,而onclick事件触发之前,for(var i= 0,len = oLis.length;i<len;i++)这个循环已经运行完成了!oLis[i].onclick = function()这段代码只是挂在那里(挂这个词不怎么准确,意思放在那里,等待onclick事件触发),这时候的i=3.在 oLis[i].onclick = function()之前document.writeln(i)你会发现输出012,说明循环已经完成.
   oLis[i].index = i 的作用只是在循环的过程中绑定下标i(0 1 2)到oLis数组相应元素oLis[0] oLis[1] oLis[2]的index变量上(例如oLis[0].index = 0;oLis[1].index =1;oLis[2].index=2)

   当onclick事件触发的时候,this.className中的this就是当前鼠标所在的元素(例如家居), 同时oDivs[this.index]会获取到家居所对应的oLis数组中的index值(这里是1,因为我们已经在完成的循环中将oLis[1]=1 了),而如果换成oLis[i]则因为i===3(恒等于3),所以oLis[i]===oLis[3],当然会出错了!建议好好看一下JS的闭包原理和事件机制!


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

按理说 OLis在windoe.onload{}内部是全局变量

应该在内层函数中也能用啊

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

this指当前元素,而在循环体中oLis[i]有一个事件,而这个事件调用的函数中并没有参数,所以会出现这样的结果,如果想在函数调用某个变量的时候,要不就是在该函数中有这个变量,要不就是将这个变量作为参数传递到函数中

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

thenger

哪像全局变量这类参数在函数体中如果没有特别声明也不能使用?
2015-02-21 回复 有任何疑惑可以回复我~
#2

Ambition_zl

不对吧,依你这么说 OLis[n]也没定义,也不能用啊
2015-03-13 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

为什么把this换成oList[i]就不行?

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