这个值在JavaScript匿名函数中

Coe*_*oen 24 javascript this anonymous-function

任何人都可以向我解释为什么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();
Run Code Online (Sandbox Code Playgroud)

Ada*_*kis 32

你的匿名函数里面this是全局对象.

在里面test,这是MyObject调用该方法的实例.


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

somceFunction(); // called function invocation
Run Code Online (Sandbox Code Playgroud)

this永远全局对象,或undefined在严格模式下(除非someFunction与创建bind** -见下文)

每当你调用这样的函数时

foo.someMethod();  //called method invocation
Run Code Online (Sandbox Code Playgroud)

this 被设置为 foo


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

所以这

    var obj = { a: 12 };
    var someFunction = (function () { alert(this.a); }).bind(obj);
    someFunction();
Run Code Online (Sandbox Code Playgroud)

导致someFucntion与被调用this等于obj和警报12.我提起这事,唯一要注意的是,这是一个潜在的例外,我提到关于援引为函数的规则

someFunction();
Run Code Online (Sandbox Code Playgroud)

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


Cam*_*ron 19

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

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

换句话说,this更改取决于函数的调用方式,而不是定义的位置和方式.您使用匿名函数(在另一个函数中定义)的事实是巧合的,并且对值没有影响this.

  • 你的陈述"`this`根据函数*被调用*的方式而改变,而不是在何处或如何定义",这可能会产生误导.事实上,`this`只是被调用函数的所有者 - 而且它本身总是要么显式定义,要么默认为全局对象.`myVar.doSomething = doSomething;`将函数`myVar.doSomething`定义为`doSomething`,其中`this`在调用`myVar.doSomething()`时总是引用`myVar`,无论`myVar.doSomething() `来自.您的陈述可能另有建议. (4认同)

Thi*_*ter 6

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

有多种方法可以访问实例:

var self = this;
(function () {
    console.log("B", self instanceof MyObject);
}());
Run Code Online (Sandbox Code Playgroud)

要么

(function () {
    console.log("B", this instanceof MyObject);
}).call(this);
Run Code Online (Sandbox Code Playgroud)