this 关键字,它是一个指针,指向某一个对象。
和其它面象对象程序语言一样,JavaScript也是支持面向对像的。所以,JavaScript中的每一个函数,从广义上讲都是属于某一个对象的,函数是不会孤立的存在的,它一定属于某一个对象。明白了这个道理,再回过头来看JS中的this指针,就不难理解了。
但是JS函数,看起来好像是独立存在的。
举个最简单的例子:
function test() {
alert(this);
}
函数,被我们写在了一个JS文件中,然后被引用到HTML页面中,看起来好像它跟任何对象没有关系。在这个页面中的任何一个地方都可以调用这个函数。那么这个函数是属于哪个对象呢???答案是,要看你怎么去调用这个函数。如果你直接在页面中调用 test(),那么它就是属于 windows这个对像,当然,它中间的那个this指针当然就是指向windows这个对象了。这个时候你要把test()看做是windwows的一个成员函数。第一种:
<div οnclick="test()">button</div>
返回结果是:
也就是说,现在的this并没有像我们想的那样指向出发时间的div,而是指向了window对象。
之所以出现这样的情况是因为test方法是window的方法,而不是这个div的方法。所以在标签用事件来触发方法的时候应该把this关键字当做参数传递下,在widow的方法里就可以使用了。类似上例:
<div id = "test" οnclick="test(this)">button</div>
<script type="text/javascript">
function test(tobj) {
alert(tobj.id);
}
</script>
</body>
那在什么样的情况下才不需要传递参数呢?当函数是触发事件的对象自己的函数的时候。也就是函数的owner是对象本身。
<body>
<div id = "test">button</div>
<script type="text/javascript">
function test() {
alert(this.id);
}
document.getElementById("test").οnclick=test;
</script>
</body>
上面的代码正常弹出test。
这里要注意下面两个绑定的区别:
<script type="text/javascript">
function test() {
alert(this.id);
}
//document.getElementById("test").οnclick=test;
document.getElementById("test").οnclick=function(){test()};
</script>
这种情况下是在给ID是test的变迁的onclick事件赋值。也就是把window的方法test拷贝了一次放在了onclick事件里。这个拷贝后的方法owner已经变成ID是test的对象。(因为是赋值关系,所以后一个赋值会覆盖掉前一个赋值。所以onclick绑定多个方法时只执行一个。)
getElementById("test").οnclick=function(){test()}; 这种情况则是在onclick的时候执行方法window的方法test。因为window没有id,所以执行这句话的时候会报错。undefined。