关于this问题

来源:9-22 编程练习

PDD一枚

2015-11-24 20:49

 window.onload = function(){                  

     // 鼠标移动改变背景,可以通过给每行绑定鼠标移上事件和鼠标移除事件来改变所在行背景色。

     var hh=document.getElementsByTagName("tr");

     for(var i=0;i<hh.length;i++)

     {   

        hh[i].onmouseover=function(){ 

             this.style.backgroundColor= "#f2f2f2";

        }

         hh[i].onmouseout=function(){ 

           this.style.backgroundColor= "#fff";

        }      }  }

为什么这段代码里,改背景色时用this就成功了,可是用  hh[i]不行?

写回答 关注

3回答

  • 慕男婶
    2015-11-24 21:42:18
    已采纳

    这个问题,如果你js基础不好或刚入门的话,给你解释估计你也会难于理解。。我试着解释一下吧,理解了更好,不理解你再问我。。

    window.onload = function(){                  
         // 鼠标移动改变背景,可以通过给每行绑定鼠标移上事件和鼠标移除事件来改变所在行背景色。
         var hh=document.getElementsByTagName("tr");
         for(var i=0;i<hh.length;i++)
         {   
            hh[i].onmouseover=function(){ 
                 this.style.backgroundColor= "#f2f2f2";
            }
             hh[i].onmouseout=function(){ 
               this.style.backgroundColor= "#fff";
            }      
          }  
    }

    这几段代码的意思是,在页面加载完毕之后,选出来所有的tr元素,由于所有的tr元素是放在一个nodeList里(你可以认为是一个数组),所以可以循环它,来给每个tr绑定mouseover和mouseout事件。。

    这些你肯定都理解。。

    那为什么使用hh[i]就不行,使用this就可以了呢?

    因为,循环执行的很快,一瞬间就执行完毕了,所以当你触发mouseover和mouseout事件时,循环早就执行完毕了,执行完毕时,此时 i = hh.length,所以,你使用 hh[i] 也就是 hh[hh.length] 并不能取出任何元素(返回undefined),那么你要实现的目标“给每个tr绑定mouseover和mouseout事件”显然是实现不了的。。


    但是为什么this就可以了呢?因为不论如何,事件处理函数中的this对象始终指向每一个tr,所以它就可以。。


     



    慕男婶 回复PDD一枚

    我解释的你听懂了没?

    2015-11-25 16:16:52

    共 2 条回复 >

  • 浅夏诗韵
    2015-12-01 21:27:57

    讲的很好。不过我想知道这个this指针为什么指向的是“tr”

  • 李晓健
    2015-11-24 21:16:33

JavaScript进阶篇

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

468060 学习 · 21891 问题

查看课程

相似问题