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

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

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

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";
              }
          }
        }


正在回答

5 回答

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

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

phenix770 提问者

非常感谢!
2016-03-04 回复 有任何疑惑可以回复我~
#2

长颈鹿在附近

为什么第二种就无法绑定相应的方法,不是有trs[i]吗
2016-03-05 回复 有任何疑惑可以回复我~

方法一中,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行同理

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


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

慕粉3561241

即是5行的 trs[i]...打错了.
2016-03-27 回复 有任何疑惑可以回复我~

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

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

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

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

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

看看 一起学习

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

举报

0/150
提交
取消

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

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