2017-08-20 8 views
0

でネストされた矢印の機能で期待どおりに動作しないと、私はこのコードを使用することができますなぜ私は理解していない:これは私が機能を矢印に新たなんだES6

const adder = { 
    sum: 0, 
    add(numbers) { 
     numbers.forEach(n => { 
      this.sum += n; 
     }); 
    } 
}; 

adder.add([1,2,3]); 
// adder.sum === 6 

を...とそれだけで正常に動作し、しかし、次のような場合にはthisが正しくバインドされていません:MDNから

const adder = { 
    sum: 0, 
    add: (numbers) => { 
     numbers.forEach(n => { 
      this.sum += n; 
     }); 
    } 
}; 

adder.add([1,2,3]); 
// Cannot read property sum 
+0

どちらの場合でも 'console.log(this)'と書いてください。 –

+0

これは重複としてマークされている理由はわかりません。それは一般的に矢印関数ではなく、2つの入れ子の矢印関数についてです。 –

答えて

3

矢印関数式がshorteを持っていますRの関数式よりも構文と独自のこの、引数、スーパー、またはnew.targetを結合しない。(...)

矢印関数内thisがoutterを参照していることの意味は、ほとんどのthisがあります。ブラウザで実行した場合、thiswindowオブジェクトです。

this.sumの代わりにadder.sumを使用してください。

Fiddle

+0

申し訳ありませんが、わかりません。だから、最初のケースでは 'this.sum'は' adder.sum'を、2番目のケース 'window.sum'は?なぜ2つの違いがありますか?あなたはそれが最も外側の「これ」だと言いますが、それは2つのケースが同一でなければならないことを意味します。 –

+0

です。矢印関数は 'this'に束縛されません。したがって、 'this.adder'にアクセスすると、コンテキスト内の最初の' this'にアクセスしています。おそらく 'window'オブジェクトです。 – pedromss

0

アロー機能は、字句thisに到達することができます。コンテキストはadderではなく、adderで定義されています。そのように動作するように期待されている

function Foo() { 
    // this === foo; 
    this.sum = 0; 

    const adder = { 
     sum: 0, 
     add: (numbers) => { 
      numbers.forEach(n => { 
       // this === foo; 
       this.sum += n; 
      }); 
     } 
    }; 

    adder.add([1,2,3]); 
} 

const foo = new Foo; 

そして

const adder = { 
    sum: 0, 
    add(numbers) { ... } 
}; 

のでadd方法は、それがのように呼ばれていますadderthisとしてときがあります

const adder = { 
    sum: 0, 
    add: function (numbers) { ... } 
}; 

のショートカットですadder.add(...)

+0

もちろん、ここで 'adder.add'は呼び出されず、外部にも利用できません。 – Bergi

+0

ありがとう、わかりやすくするために修正しました。 – estus

+0

申し訳ありませんが、わかりません。どうして、最初のケースでは、「this.sum」は 'adder.sum'を指しているのでしょうか、それは間違った仮定ですか? –

関連する問題