日期:2014-05-16  浏览次数:20397 次

事件中的this
代码1
JScript code

<script type="text/javascript">
    
    function a()
    {
        alert(this);
    }

</script>

<a href="#" onclick='a();'>a</a>



代码2
JScript code

<script type="text/javascript">
    
    function a()
    {
        var b;
        b=document.getElementsByTagName('a')[0];
        b.onmouseover=function(){alert(this);}
    }
    window.onload=a
</script>

<a href="#" onclick='a();'>a</a>



觉得很奇怪的。为什么代码1运行的时候是object。代码2运行的时候是这个标签的href
this为什么指向的对象不一样呢?


------解决方案--------------------
第一个指的方法。。第二个指的是b
------解决方案--------------------
代码1中的this指向的是类型为function的object
代码2中的this指向hyper link
------解决方案--------------------
HTML code
//第一个类似于(obj表示a标签)
obj.onclick=function(){
    a(); //function a 的作用域为window
};

//若要得到预期结果,可以这样调用,可以google call的用法
<a href="#" onclick='a.call(this);'>a</a>

//也可以直接传入a标签
<script type="text/javascript">
    
    function a(obj)
    {
        alert(obj);
    }

</script>
<a href="#" onclick='a(this);'>a</a>

------解决方案--------------------
第一种方法采用在事件函数中调用函数的方式,这种情况下this的指代根据上下文确定,第二种方法是把函数作为了对象的一个方法,这时this指代拥有方法的对象

要弄清楚this在各种情况下的指代对象,不真真正正写上几个控件是不得行的
其实说穿了也简单:
方法中的this指代的就是方法的拥有者,全局函数中的this指代window,局部函数中的this要看上下文,看其归属的对象
但是要记住,this只有在函数调用时才能确定其中的this的指代,比如同一个函数作为全局函数被调用和作为方法被调用其this代表的东西就不一样。
var obj=new Object();
function test()
{
alert(this);
}
obj.test=test;
test();
obj.test();//都是这个函数,但是this不一样,自己体会

------解决方案--------------------
HTML code

<script type="text/javascript">
    
    function a()
    {
        var b;
        alert(this);
    }

</script>

<a href="#" onclick='a();'>a</a>