您正在考虑 OO 术语,但您发布的代码不是 OO。正如 Rob W 在他的帖子中所说,默认this
是window
or undefined
in strict 模式。
this
仅在特定功能或情况根据上下文为其提供值时才更改值。
在类模拟中使用函数的地方,即实例化(通过new
)而不是简单地调用,this
指向您所期望的实例。
function Dog(name) {
this.name = name;
alert(name);
}
var fido = new Dog('Fido'); //alerts 'Fido'
提供上下文的其他情况this
包括事件处理程序(至少在addEventListener
模型中,而不是较旧的 IE)以及您自己使用call()
或apply()
手动设置this
上下文的任何时间。
另外,不要认为this
指向 JavaScript 中的函数“所有者”。在一个事件中,this
指向受影响的元素,但将该元素视为“拥有”回调函数是没有帮助的——它只是在该元素的上下文中运行。
最后,正如 Quentin 提到的,没有办法引用this
. 您必须先将其缓存在变量中。
function Dog() {
var that = this;
setTimeout(function() {
alert(this); //window - setTimeout() has overwritten the 'this' context
alert(that); //we reference our cached, outer context
}, 500);
}
var fido = new Dog('Fido');