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

关于移动鼠标的几种写法求人指点下

是这样的 我开始写关于这个鼠标移动的代码然后写了几种形式发现都不能实现 一开始以为是写错了或者语法有误  请大家看看

window.onload = function shubiao(){
        var a=document.getElementsByTagName("tr")
     // 鼠标移动改变背景,可以通过给每行绑定鼠标移上事件和鼠标移除事件来改变所在行背景色。
     
       for(i=0;i<a.length;i++){
    function sb(a){

tr[a].style.backgroundColor="#f2f2f2"

}

 function sq(a){

tr[a].style.backgroundColor="#fff"

}


    
       a[i].onmouseover=sb(i)
       a[i].onmouseout=sq(i)
       
       }

这种在for里面定义函数的方法感觉有问题 但是我感觉定义在for外面也不对


我后面自己在网上研究了之后得到的结果是

window.onload = function(){

                  

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

         var tr=document.getElementsByTagName("tr")

function sb(a){

    return function (){

          tr[a].style.backgroundColor="#f2f2f2"   

    }   

}

            function sq(b){

    return function (){

          tr[b].style.backgroundColor="#fff"   

    }   

}

     for(i=0;i<tr.length;i++){

         tr[i].onmouseover=sb(i);

         tr[i].onmouseout=sq(i);

     }

 

}

     

请高手指点下  谢谢!

提问者:mosaice 2015-05-29 21:20

个回答

  • 戈饭
    2015-05-31 19:23:01
    已采纳

    你循环了N次,sb(a)也声明了多次……但这不是重点,重点是你以为sb(a)的a会分别根据i来赋值,每个sb都有自己的i值,但其实他们引用的都是最后一个i,因为每个sb的作用域链都保存着匿名函数的活动对象。

    下面是用了闭包的方法,这样每个sb(a)就会有不同的i,sb有创建了一个闭包,这个闭包保存了i值的副本,所以可以返回不同的数值。