2017-04-23 11 views
0

シンプルなES5コードをES6に変換しようとすると、ちょっと困惑しています。矢印関数はcall、apply、bindを使用しています - 動作していませんか?

var obj = {num: 2} 

var addToThis = function (a, b, c) { 
    return this.num + a + b + c 
} 

// call 
console.log(addToThis.call(obj, 1, 2, 3)) 

// apply 
const arr = [1, 2, 3] 
console.log(addToThis.apply(obj, arr)) 

// bind 
const bound = addToThis.bind(obj) 
console.log(bound(1, 2, 3)) 

すべてが上記の円滑かつ期待通りに動作します:

のは、私はこのコードのブロックを持っているとしましょう。

しかし、すぐに、私はこのように、constの矢印機能などES6機能を使い始めるよう:

const obj = {num: 2} 

const addToThis = (a, b, c) => { 
    return this.num + a + b + c 
} 

それはもう動作し、エラーをスローしませんが、未定義のプロパティ「NUM」を読み取ることができません。

誰かがthisがもう動作しない理由を説明してもらえますか?

答えて

0

ラムダ関数(矢印関数)は、新しい関数コンテキストを作成せず、呼び出し関数のコンテキストを使用しません。

"this"は親コンテキストを指します。 'num'変数が未定義変数よりもない場合。

通常は作成するすべての関数で新しいコンテキストを作成するのではなく、1つのコンテキストを使用することが多いため、通常は便利です。私の意見では、/ apply/bindは完全に混乱しており、ラムダ関数はそれを不要にします。

関連する問題