2012-07-02 37 views
5

是否有人可以解释为什么'this'指向DOM Object而不是Window?Javascript中的'this'的值

$("a").click(function() { 
    console.log(this); 
}); 

这产生于:

<a id="first" href="http://jquery.com"> 

考虑这应该是相同的情况如下:

function Foo() { 
    this.click = function(f) { 
     f(); 
    } 
} 

var obj = new Foo(); 
obj.click(function() { 
    console.log(this); 
}); 

我们来到这里是Window对象(我所期望的)。

+0

jQuery在需要的地方操纵'this'。 – Blaster

+0

像往常一样,MDN有这方面的一些很好的信息:https://developer.mozilla.org/en/DOM/element.addEventListener#The_value_of_this_within_the_handler – Niko

+0

我认为你应该问的人是John Resig,他负责这个概念,据我所知 - 我相信这是他的做法。相信与否 - 但他是[此处的活跃成员](http://stackoverflow.com/users/6524/john-resig)。 :) –

回答

5

这取决于函数执行的上下文。 jQuery显式地改变回调函数的上下文,而你的函数在全局上下文中执行函数。

改变上下文:

function Foo() { 
    this.click = function(f) { 
     f.apply(this); 
    } 
} 

function Foo() { 
    this.click = function(f) { 
     this.f = f 
     this.f(); 
    } 
} 

如需进一步阅读:

http://dailyjs.com/2012/06/18/js101-this/

http://dailyjs.com/2012/06/25/this-binding/

+0

好的答案man:P'this'也指DOM被调用的当前元素。 +1 rep – Killrawr

+0

是的,谢谢你的注意:) – Gottox

+0

或'f.call(this);' – newacct

4

this将由上下文决定。

如果您将代码更改为以下,则this将指向some_other_object

function Foo() { 
    this.click = function(f) { 
     f.call(some_other_object); 
    } 
} 
6

在Javascript中,OOP与您习惯使用Java等语言不同。

基本上,认为没有OOP并且this只是功能的“隐藏参数”更容易。

例如,当你看到

function f(x, y, z) { 
    console.log(this, x, y, z); 
} 

认为,在共同的OOP语言(如Java),这将是

function f(this, x, y, z) { 
    console.log(this, x, y, z); 
} 

当你看到var a = b.f(x, y, z);,认为var a = f(b, x, y, z)

当你看到var a = f(x, y, z);认为var a = f(undefined, x, y, z);(在浏览器环境中,当strict mode没有被激活,它是f(window, x, y, z);

现在,应该是比较容易理解为什么this在你的榜样是指在嵌套的范围不同的事情。

+0

+1 - 很好的解释 –

2

jQuery在调用事件处理程序时使用javascript apply函数。从mdn文档:

调用具有给定此值和作为数组提供的参数的函数。