2017-07-18 35 views
1

考慮此javascript:的Javascript的成員函數調用

let m = { 
    add: (a,b) => a+b, 
    subtract: (a,b) => a-b, 
    doit:() => console.log(this.add(5,4)), 
}; 

m.doit(); 

當我運行這段代碼,我得到以下錯誤:

doit:() => console.log(this.add(5,4)), 
          ^
TypeError: this.add is not a function 

什麼是正確的方式來調用add功能從doit

+1

** Arrow功能**不結合'this'。一個常規函數:'doit:function(){console.log(this.add(5,4)); ''應該工作。 –

+1

箭頭函數內部的這個參數被綁定到了這個封閉類型。在上面的代碼中,你可以用完整的「功能」函數來替換你的函數。或者你可以引用「m」而不是「this」 –

+1

解決這個問題的另一種方法是使用'm'而不是'this':'doit:()=> console.log(m.add(5,4 ))' –

回答

1

箭頭函數使用來自外部作用域的this,但不包括它們被調用的對象。

試試這個:

let m = { 
    add: function(a,b) { return a+b; }, 
    doit: function() { console.log(this.add(5,4)); } 
}; 

然而,爲什麼不使用類在這種情況下?

+1

不需要改變'add',因爲它不使用'this'。 –

+0

@ibrahimmahrir技術上屬實,但對於一致性... –

+0

同意但它有點造成混淆。 –

1

箭頭函數允許使用詞法this,它不是m對象,而是定義了m的上下文。

適當爲對象常量方法短的語法是:

​​