2016-11-16 13 views
0

スニペット1で何が問題なのか教えてください。私のobj.discover()の出力は3です。thisをオブジェクトの矢印関数メソッドにバインドする方法はありますか?矢印機能が混乱している

'use strict' 

// Snippet 1 
var obj = { 
    data: 3, 
    discover:() => { 
    return this.data 
    } 
} 
obj.discover() // -> undefined 
obj.discover.bind(obj)() // undefined 

// but if I don't use the arrow notation, everything works 
// Snippet 2 
var obj2 = { 
    data: 3, 
    discover: function(){ 
    return this.data 
    } 
} 
obj2.discover() // -> 3 
+2

Arrow関数は独自の 'this'を持っていません。そのために通常の関数を使用します。 –

答えて

2

矢印機能は構文糖だけでなく、いくつかの動作も異なります。矢印の関数では、thisは常に、関数定義時に指していたオブジェクトを指しています。

+1

OPsの場合、' this'は 'obj'で' discover'が作成されたときのグローバルオブジェクトです。 'new'などを使って作成したオブジェクトであれば、そのように矢印関数で' this'を使うとよいでしょう。 –

+0

@JamesThorpeあなたの徹底的な説明をありがとう。 – anhldbk

+1

@dejavu_cmd_delt:ありがとうございました。 – anhldbk

0

矢印機能はバインディングを許可していません。 MDNにthisの参照を確認します。

矢印関数式は 式とは独自のこの、引数、スーパー、または new.targetを結合しない機能に比べて短い構文があります。

矢印機能は、thisをその字句範囲に解決します。

関連する問題