this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象。但是在javascript中,由于 javascript的动态性(解释执行,当然也有简单的预编译过程),this的指向在运行时才确定。这个特性在给我们带来迷惑的同时也带来了编程上的自由和灵活,结合apply(call)方法,可以使JS变得异常强大。
2.变化的this 在JavaScript中,this通常指向的是我们正在执行的函数本身,或者是指向该函数所属的对象(运行时)。当我们在页面中定义了函数 doSomething()的时候,它的owner是页面,或者是JavaScript中的window对象(或 global对象)。对于一个onclick属性,它为它所属的HTML元素所拥有,this应该指向该HTML元素。 2.1在几种常见场景中this的变化 函数示例- function doSomething ()
- {
- alert(this.navigator); //appCodeName
- this.value = "I am from the Object constructor";
- this.style.backgroundColor = "#000000";
- }
- <element onclick=”doSomething()”>
此时this指向 window对象 。
2) Traditional event registration 传统事件注册 (DHTML方式). 形如 element.onclick = doSomething; 此时this指向 element对象 3)作为参数传递可以指向element 3.作为对象使用时this指向当前对象。形如:new doSomething(); 4.使用apply 或者call方法时,this指向所传递的对象。 形如:
- var obj={};
- doSomething.apply(obj,new Array(”nothing”); //this指向obj
- function doSomething() {
- this.style.color = '#cc0000';
- }
在JavaScript中,this通常指向的是我们正在执行的函数本身(译者注:用owner代表this所指向的内容), 或者是,指向该函数所属的对象。当我们在页面中定义了函数doSomething()的时候,它的owner是页面,或者是JavaScript中的window对象(或 global对象)。对于一个onclick属性,它为它所属的HTML元素所拥有,this应该指向该HTML元素。
这种“所有权”就是JavaScript中面向对象的一种方式。
如果我们在没有任何更多准备情况下执行doSomething(),this关键字会指向window,并且该函数试图改变 window的style.color。因为window并没有style对象,这个函数将非常不幸的运行失败,并产生 JavaScript错误。
Copying
因此如果我们想充分利用this,我们不得不注意使用this的函数应该被正确的HTML元素所拥有。换句话说, 我们应该复制这个函数到我们的onclick属性,Traditional event registration会关心它。
Javascript代码
- element.onclick = doSomething;
这种方法使得我们能够复制这个函数到多个event handler。每次this都将指向正确的HTML元素:
这样你就可以最大限度使用this。每当执行该函数,this所指向的HTML元素都正确响应事件,这些HTML元素拥有doSomething()的一个拷贝。 Referring 然而,如果你使用inline event registration(内联事件注册) Javascript代码
- <element onclick="doSomething()">
- doSomething();
The difference 如果你想使用this来指向HTML元素响应的事件,你必须确保this关键字被写在 handler所注册的HTML元素。 Javascript代码
- element.onclick = doSomething;
- alert(element.onclick);
- function doSomething() {
- this.style.color = '#cc0000';
- }
- <element onclick="doSomething()">
- alert(element.onclick)
- function {
- doSomething()
- }
- element.onclick = doSomething
- element.addEventListener('click', doSomething, false)
- element.onclick = function() { this.style.color = '#cc0000';}
- <element onclick="this.sytle.color = '#cc0000';">
- element.onclick = function() {doSomething()}
- element.attachEvent(doSomething)
- <element onclick="doSomething()">
- <element onclick="doSomething(this)">
- function doSomething(obj) {
- //this出现在event handler中并被发送到函数
- //obj指向HTML元素,因此可以这样:
- obj.style.color = '#cc0000';
- }