2017-07-18 33 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的上下文。

适当为对象常量方法短的语法是:

​​