为什么 this
关键字在以下代码中表达不同的值?
var t = {
a: "a",
b: {
c: "c",
d: function () {
return this;
}
},
f: function () {
return this;
},
g: this
}
var k = t.f(),
l = t.g;
alert(k); // returns [object object] i.e 't'
alert(l); // returns [object DOMWindow] i.e 'window'
答案 0 :(得分:6)
如果您已经习惯了其他一些编程语言,如C ++,Java或C#,那么在JavaScript中理解this
的第一件事是:它与其他语言中的this
完全不同,甚至虽然它看起来非常相似,有时甚至表现得相似。
当您创建t
对象时,您会在创建对象时捕获this
的值,并将其存储在属性{{1}中}。因此,g
将是创建g
时的this
。因为默认情况下t
引用全局对象(this
,在浏览器上),除非您使用的是严格模式,这就是window
将会是什么。
相比之下,您的t.g
函数正在调用,并返回调用中存在的t.f
值。在JavaScript(现在)中,this
完全由如何调用函数而不是它定义的位置决定。特别是,当您将函数作为从属性引用检索函数的表达式的一部分调用时,this
将设置为调用中的对象。这是一种复杂的说法,当您this
t.f()
时,f
this
t
将会{{1}}。
进一步阅读(在我的博客上):