原因是当您调用 时foo(),您是在window对象范围内调用它。这意味着在 的内部foo(), 的值this设置为window。
因此,this.taco()is 实际上window.taco()与 相同taco()。换句话说,taco()是一个全局函数,因此无论您将其称为 as taco()、 aswindow.taco()还是 as this.taco()when thisis ,它都可以工作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()函数如 这就是您原始示例中发生的情况。thiswindowthisundefined
如果您调用具有对象引用的方法obj.foo(),this则将被设置为obj对象。
如果您使用.apply()or进行函数调用.call(),那么您可以专门控制使用orthis的第一个参数设置的值。例如:将调用函数并设置指向对象的指针。.apply().call()foo.call(obj)foo()thisobj
如果您不在任何函数调用中(例如在全局范围内),那么this将是全局对象(window在浏览器中)或undefined处于严格模式。
与上述所有规则一样,this由调用者调用您的方式控制,而不是函数/方法的定义方式。