有人可以向我解释为什么A
为真且B
为假?我本以为B也是如此。
function MyObject() {
};
MyObject.prototype.test = function () {
console.log("A", this instanceof MyObject);
(function () {
console.log("B", this instanceof MyObject);
}());
}
new MyObject().test();
答案 0 :(得分:32)
您的匿名函数this
内部是全局对象。
在test
内部,这是调用该方法的MyObject
实例。
每当你调用这样的函数时:
somceFunction(); // called function invocation
this
始终全局对象,或undefined
处于严格模式(除非使用someFunction
创建bind
** - 见下文)
每当你调用这样的函数时
foo.someMethod(); //called method invocation
this
设置为foo
** EcmaScript5定义了一个bind
函数,允许您创建一个具有[{1}}预设值的函数
所以这个
this
导致 var obj = { a: 12 };
var someFunction = (function () { alert(this.a); }).bind(obj);
someFunction();
调用someFucntion
等于this
,并发出警报12.我提出这一点只是为了注意这是我提到的关于函数的规则的一个潜在例外被调用为
obj
始终使someFunction();
等于全局对象(或严格模式下为this
)
答案 1 :(得分:18)
this
很特别。它指的是代表函数被调用的对象(最常见的是通过点语法)。
因此,在A
的情况下,代表新的MyObject
对象调用该函数。 B
处于不代表任何对象显式调用的不同函数中,因此this
默认为全局对象(window
)。
换句话说,this
的变化取决于函数的调用方式,而不是它的定义位置和方式。您使用匿名函数(在另一个函数中定义)的事实是巧合的,并且对this
的值没有影响。
答案 2 :(得分:6)
在匿名函数中,this
绑定到全局对象(浏览器环境中为window
)。
有多种方法可以访问实例:
var self = this;
(function () {
console.log("B", self instanceof MyObject);
}());
或
(function () {
console.log("B", this instanceof MyObject);
}).call(this);
答案 3 :(得分:4)
this
您的匿名函数是正常的函数调用,因此this
是全局对象。
您可以写(function() { ... }).call(this)
与this
明确调用它。