如何将箭头函数重写为常规函数并绑定上下文?

2 javascript ecmascript-6 arrow-functions

我正在检查ES6中引入的箭头功能.如果我有一段带有"addNinja"功能的代码:

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

 }
Run Code Online (Sandbox Code Playgroud)

有没有办法可以在没有箭头功能的情况下编写?

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

x=>x*2 

function(x){
return x*2;
}
Run Code Online (Sandbox Code Playgroud)

我将假设我可以重写addNinja函数,如下面的代码,但我收到一个错误.

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

 }
Run Code Online (Sandbox Code Playgroud)

Osc*_*nco 5

function() {}语法不当地实际情况结合的功能,这就是为什么this.setState还是this.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);
}
Run Code Online (Sandbox Code Playgroud)

  • 它不太可能是'this`是'undefined` - 它将由它的词汇上下文定义,它可能是全局对象.尽管如此+1. (2认同)