3
obj = {
  go: function() { alert(this) }
}

obj.go(); // object

(obj.go)(); // object

(a = obj.go)(); // window

(0 || obj.go)(); // window

谁能解释一下为什么后两个打印窗口对象而前两个打印参考。

4

1 回答 1

6

当你直接执行一个方法时,就像最后两种形式一样,this指针没有设置为对象。当不在严格模式下时,它被设置为window(在严格模式下,它会被设置为 undefined 以帮助您捕获错误)。this指针是根据您在 javascript 中调用某些内容的方式设置的 。

始终确保相应this设置指针的最简单方法是始终在对象的上下文中调用该方法,例如:

obj.go();

这里有些例子:

obj.method()    // this in method automatically set to obj

var a = obj.method();
a();            // this set to window as no object context is provided

var a = obj.method();
a.call(obj)     // this explicitly set to obj by .call()
a.apply(obj)    // this explicitly set to obj by .apply()

您应该记住的是,这obj.go只是 javascript 中的一个函数,最初存储为obj. 但是,一旦您获得了该属性值,它就只是一个函数指针,不再与任何特定对象有任何显式关联。this如果您希望在方法内适当地设置指针,则必须在如何调用它时为其提供与对象的关联。这与其他一些语言不同,并且与 JS 中的许多不同之处一样,它既可以是您可以利用的功能,也可以是偶尔令人困惑的学习方式。

于 2012-12-28T20:19:15.493 回答