原因是当您调用 时foo()
,您是在window
对象范围内调用它。这意味着在 的内部foo()
, 的值this
设置为window
。
因此,this.taco()
is 实际上window.taco()
与 相同taco()
。换句话说,taco()
是一个全局函数,因此无论您将其称为 as taco()
、 aswindow.taco()
还是 as this.taco()
when this
is ,它都可以工作window
。
如果您taco()
像这样涉及一个新对象,其中this
设置为的新实例foo
并且不等于window
,那么您会得到预期的运行时错误:
function foo() {
var bar = "baz";
this.taco = function() {
console.log(this);
console.log(bar);
};
this.taco();
taco(); // I expected a runtime error here.
}
var x = new foo();
示例:http: //jsfiddle.net/jfriend00/3LkxU/
如果您对 的值感到困惑this
,可以使用以下 javascript 规则来确定 的值this
:
new
如果您使用like调用函数x = new foo()
,则会创建一个新实例,foo
并将值this
设置为函数内部的该对象,并且默认情况foo()
下会返回该新实例。foo()
如果您通常调用任何foo()
函数如 这就是您原始示例中发生的情况。this
window
this
undefined
如果您调用具有对象引用的方法obj.foo()
,this
则将被设置为obj
对象。
如果您使用.apply()
or进行函数调用.call()
,那么您可以专门控制使用orthis
的第一个参数设置的值。例如:将调用函数并设置指向对象的指针。.apply()
.call()
foo.call(obj)
foo()
this
obj
如果您不在任何函数调用中(例如在全局范围内),那么this
将是全局对象(window
在浏览器中)或undefined
处于严格模式。
与上述所有规则一样,this
由调用者调用您的方式控制,而不是函数/方法的定义方式。