33

谁能向我解释为什么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();

更新:从 ecmascript-6 开始,您可以使用箭头函数,这样可以轻松引用 MyObject,如下所示:

function MyObject() {

};

MyObject.prototype.test = function () {
    console.log("A", this instanceof MyObject);
    (() => {//a change is here, which will have the effect of the next line resulting in true
        console.log("B", this instanceof MyObject);
    })(); //and here is a change
}

new MyObject().test();    
4

4 回答 4

35

匿名函数内部this是全局对象。

在 内部,这是调用方法test的实例。MyObject


每当你调用这样的函数时:

somceFunction(); // called function invocation

this始终全局对象,或者undefined处于严格模式(除非someFunction是用bind**创建的——见下文)

每当你调用这样的函数时

foo.someMethod();  //called method invocation

this被设定为foo


** EcmaScript5 定义了一个bind函数,允许您创建一个具有预设值的函数this

所以这

    var obj = { a: 12 };
    var someFunction = (function () { alert(this.a); }).bind(obj);
    someFunction();

使用等于someFucntion调用的原因和警报 12. 我提出这个只是为了注意这是我提到的关于调用函数的规则的潜在例外thisobj

someFunction();

总是this等于全局对象(或undefined在严格模式下)

于 2011-12-29T17:09:18.690 回答
24

this很特别。它指的是函数被代表调用的对象(最常见的是通过点语法)。

因此,在 的情况下A,代表一个新MyObject对象调用该函数。B在一个不同的函数中,该函数没有代表任何对象显式调用,因此this默认为全局对象 ( window)。

换句话说,this变化取决于函数的调用方式,而不是定义的位置或方式。您使用匿名函数(在另一个函数中定义)的事实是巧合,对this.

于 2011-12-29T17:10:52.077 回答
10

在匿名函数中,this绑定到全局对象(window在浏览器环境中)。

访问实例有多种方式:

var self = this;
(function () {
    console.log("B", self instanceof MyObject);
}());

或者

(function () {
    console.log("B", this instanceof MyObject);
}).call(this);
于 2011-12-29T17:09:19.603 回答
4

this根据调用函数的方式设置。
您的匿名函数是普通函数调用,this全局对象也是如此。

您可以(function() { ... }).call(this)使用您的this.

于 2011-12-29T17:09:11.210 回答