【问题标题】:How to re-write arrow function to regular function and bind context? [duplicate]如何将箭头函数重写为常规函数并绑定上下文? [复制]
【发布时间】:2019-02-14 12:15:53
【问题描述】:

我正在检查 ES6 中引入的箭头函数。如果我有这段带有“addNinja”功能的代码:

 addNinja=(ninja)=>{
         ninja.id=Math.random();
         let ninjas=[...this.state.ninjas,ninja];
         this.setState({
             ninjas:ninjas
         })
        console.log(this.state);

 }

有没有什么方法可以在没有箭头函数的情况下编写?

如果我考虑到这两个是相同的......

x=>x*2 

function(x){
return x*2;
}

我假设我可以像下面的代码那样重写 addNinja 函数,但我得到一个错误。

 addNinja=function(ninja){
         ninja.id=Math.random();
         let ninjas=[...this.state.ninjas,ninja]; 
         this.setState({
             ninjas:ninjas
         })
        console.log(this.state);

 }

【问题讨论】:

  • “但我得到一个错误” - 错误消息可能是关于错误是什么的线索。虽然如果我猜我会认为this 的绑定在两者之间是不同的。
  • 不幸的是,仅将箭头函数转换为常规函数不太可能工作,因为在两种情况下处理 this 的方式不同。
  • 错误是:Cannot read property 'ninjas' of undefined
  • “如果我考虑到这两个是相同的......”你会相信谎言。箭头函数不能成为方法(即不要将this 设置为像“正确”函数那样的接收器对象,而是将this 视为关闭下的任何其他变量)。

标签: javascript ecmascript-6 arrow-functions


【解决方案1】:

function() {} 语法没有将本地上下文绑定到函数,这就是为什么this.setStatethis.state.something 失败的原因,因为this 是由全局词法上下文定义的,而state 不存在在里面。如果你想实现这一点,你必须手动绑定函数:

constructor(props) {
  this.addNinja = this.addNinja.bind(this);
}

addNinja=function(ninja){
         ninja.id=Math.random();
         let ninjas=[...this.state.ninjas,ninja]; 
         this.setState({
             ninjas:ninjas
         })
        console.log(this.state);
}

【讨论】:

  • this 不太可能是 undefined - 它将由其词法上下文定义,这很可能是全局对象。尽管如此 +1。
  • 真的,谢谢,更新了答案
  • 只调用this.addNinja.bind(this) 将无济于事,您需要对结果进行一些处理。此外,这看起来像 class 主体,然后您应该使用 addNinja 的方法语法
  • 我知道我忘记了什么:P
  • 只是一个简单的问题:您可以将类方法绑定到构造函数内部以外的其他地方吗?如果是这样,在那里做有什么好处?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
  • 2020-02-20
  • 2018-11-10
  • 2018-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多