问答详情
源自:9-22 编程练习

好奇怪的函数调用问题,求解答,谢谢

下面两种实现选中变色的方式,为什么只有第一种有效果,而第二种方法没有任何效果,求解答

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


提问者:phenix770 2016-03-02 10:37

个回答

  • 丨丨丨丨丨
    2016-03-02 18:11:20
    已采纳

    第一种方法是在根据标签名循环的时候为每一个tr绑定了一个changeColor方法,参数就是下标,第二种单纯的循环无法绑定相应的方法,无法使用正确的参数去执行下边的代码,所以会报错导致不起作用。

  • 慕粉3561241
    2016-03-27 22:51:19

    方法一中,obj是形参,在整个方法内都有效,它的值通过7行的实参trs[i]传递了。

    实参trs[i]是第i个tr节点的引用,通过这个引用当然可以修改它的值。

    方法二中,5行和6行的trs[i]的区别,

    5行的trs[i],代表的是第 i 个tr节点,

    6行的trs[i],首先他不是1-12行这个匿名方法的形参、局部变量,

    而是属于5-7行定义的匿名方法的一个没有声明定义的东西。。

    就是什么都不是的意思。就不用说用它来修改什么属性了。。。

    可以通过将6行的trs[i]改为this,this表示当前调用5-7行这个匿名方法的对象,即是6行的trs[i]。

    8、9行和5、6行同理

    是这样吗?不是请告诉我哦,打字辛苦。


  • WS01234
    2016-03-07 22:20:01

    你的第二种方法的for循环的i的初始条件是0,而trs[0]是空白节点,所以会出错;

    但是你的第一张方法的i的初始条件是1,所以没有出错

  • phenix770
    2016-03-04 10:49:52

    能不能再说具体点,还是不太理解

  • qq_树叶丶_0
    2016-03-02 14:23:41

    看看 一起学习