web-dev-qa-db-ja.com

JavaScript匿名関数のこの値

AがtrueでBがfalseである理由を誰かに説明できますか? 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();    
27
Coen

thisは特別です。これは、関数が呼び出されているオブジェクトを指します(最も一般的にはドット構文を介して)。

したがって、Aの場合、関数は新しいMyObjectオブジェクトの代わりに呼び出されています。 Bは、オブジェクトの代わりに明示的に呼び出されない別の関数にあるため、thisはデフォルトでグローバルオブジェクト(window)に設定されます。

つまり、thisは、関数がどのように定義されているかではなく、関数がどのように呼び出されるであるかによって変化します。匿名関数(別の関数内で定義されている)を使用しているという事実は偶然であり、thisの値には影響しません。

19
Cameron

無名関数の内部thisはグローバルオブジェクトです。

test内では、これはメソッドが呼び出されたMyObjectのインスタンスです。


次のような関数を呼び出すときはいつでも:

somceFunction(); // called function invocation

this is alwaysグローバルオブジェクト、またはundefinedがstrictモード(someFunctionbindで作成された場合を除く)** - 下記参照)

このような関数を呼び出すときはいつでも

foo.someMethod();  //called method invocation

thisfooに設定されます


**EcmaScript5はbind関数を定義します。これにより、thisの事前設定値を持つ関数を作成できます

したがって、この

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

someFucntionthisと等しいobjで呼び出され、アラート12.が表示されます。これは、関数について述べたルールの潜在的な例外であることを示していますとして呼び出された

someFunction();

常にthisがグローバルオブジェクトと等しい(または厳密モードではundefined

32
Adam Rackis

無名関数では、thisはグローバルオブジェクト(ブラウザー環境ではwindow)にバインドされます。

インスタンスにアクセスするにはさまざまな方法があります。

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

または

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

thisは、関数の呼び出し方法に基づいて設定されます。
匿名関数は通常の関数呼び出しであるため、thisはグローバルオブジェクトです。

(function() { ... }).call(this)を使用して、明示的にthisで呼び出します。

4
SLaks