ゲッターから返された関数の `this`キーワードの値


15

次の例で、このキーワードの予期しない値が見つかりました。

let x = {
    z : 10 ,
    get func1() {
        return function(v) {
            console.log(this === v);
        }
    }
}


x.func1(x)

値は、このキーワードは、オブジェクトであるXそれは、そのオブジェクトから実行されますかのように私は期待して、get関数があるこのキーワードは呼び出し元のオブジェクトに等しいX

この例は私たちに違いを示しています

let x = {
    func2() {
        return function(v) {
            console.log(this === v);
        }
    }
}

x.func2()(x);

どちらの例でも、getter関数であるfunc1とオブジェクトのメソッドであるfunc2がオブジェクトxから実行され、返された関数が実行されます。したがって、最初の例のこの値がオブジェクトxではなくグローバルオブジェクトと等しくないのはなぜですか。


3
本当に面白い質問です 私はこれまでこのしわを決してしませんでした。
TJクラウダー

1
かのように、そのオブジェクトから実行されますが、それは- 」:右が、そのオブジェクト上で実行しますx.func1()
ベルギ

回答:


13

それは非常に興味深い質問です。

これは、プロパティアクセスの結果、関数がすぐに呼び出されるためです。したがって、これらは基本的に同等です:

let x = {
    get func1() {
        return function(v) {
            console.log(this === v);
        };
    },
    func2(v) {
        console.log(this === v);
    }
};

x.func1(x);
x.func2(x);

両方の場合において:

  1. プロパティの値が読み取られ、関数参照になります。
  2. その関数は、同じプロパティアクセス式の一部として実行されます。

実際func1アクセサプロパティであり、func2データプロパティでは重要ではありません。重要なのは、プロパティを読み取った結果の値がどのように使用されるかです。


1
式全体が関数オブジェクトに評価されて実行されると思いました。ありがとうございました
Kirollos Nasr

1
@KirollosNasrはい、そうですが、式 x.func1xはそれが後続の呼び出しのコンテキストとして参照を保持x.func2()します。これは(質問から)関数と評価されますが、メンバーアクセス式ではありません。
ベルギ

1
@Bergi-私はあなたが意味したと思いますx.func2()(x);か?
TJクラウダー

1
はい@TJCrowder、私は内部の表現を参照x.func1(x)してx.func2()(x)
Bergi

1
@Bergiええ、トリッキーな部分があります。しかし、今ではより明確になりました
。TJ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.