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で呼び出されthisobjアラートが発生します。12。これは、次のように呼び出される関数について説明したルールの潜在的な例外であることに注意してください。

someFunction();

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

于 2011-12-29T17:09:18.690 に答える
24

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

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

つまり、関数がどこでどのように定義されているかではなく、関数がどのように呼び出される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 に答える