JavaScript 匿名函数中的 this 值

IT技术 javascript ecmascript-6 this anonymous-function
2021-02-20 17:24:26

谁能向我解释为什么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个回答

匿名函数内部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被调用this等于obj,并警告 12。我提出这个只是为了注意这是我提到的关于调用函数的规则的潜在例外

someFunction();

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

该行(function () { alert(this.a); }).bind(obj)正是我正在寻找的 - 将上下文绑定到匿名函数。完美运行,+1
2021-05-09 17:24:26
您还可以设置this使用func.call(this, arg1, arg2..)
2021-05-14 17:24:26

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

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

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

你的陈述“this根据函数的调用方式而变化,而不是在何处或如何定义的”,可能会产生误导。事实上,this只是被调用函数的所有者——而且它本身总是明确定义或默认为全局对象。myVar.doSomething = doSomething;定义函数myVar.doSomethingdoSomething地方this总是引用myVar调用的时候myVar.doSomething(),无论在哪里myVar.doSomething(),从调用。你的陈述可能另有暗示。
2021-04-26 17:24:26

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

有多种访问实例的方式:

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

或者

(function () {
    console.log("B", this instanceof MyObject);
}).call(this);

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

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

好吧,我假设是严格模式,所以...... :)
2021-05-06 17:24:26
......this也是undefined
2021-05-10 17:24:26