当前位置: 首页 > 面试题库 >

ES6类中的ES6函数,箭头函数和“ this”

龚钧
2023-03-14
问题内容

class App extends Component {
constructor(props) {

}

  onChange = (e) => this.setState({term: e.target.value})

  onSubmit(e){
    e.preventDefault();
    const api_key = "C1hha1quJAQZf2JUlK";
    const url = `http://api.giphy.com/v1/gifs/search?q=${this.state.term}&api_key=${api_key}`;
  }

  render() {
    return (
      <div>
        <form onSubmit={this.onSubmit}>
          <input value={this.state.term} onChange={this.onChange}/>
          <button>Search!</button>
        </form>
      </div>
    );
  }
}

在类中声明的两种函数 (onChange和onSubmit) 之间有什么区别?如果我将其声明为ES6类方法,但在 const url中
引用this.sate时出现错误,但是将其更改为arrow函数可以解决此问题。

我想知道两种情况下如何正确处理“ this”

另外,我该如何做呢?说,如果我想使用相同的onSubmit函数(ES6类方法),但是想在调用它(在form元素中)时进行处理,该怎么办?

使用this.onSubmit.bind(this) 吗?


问题答案:

重要的是要知道以下语法:

class A {
  method = () => {}
}

只是在类构造函数中创建实例方法的语法糖:

class A {
  constructor() {
    this.method = () => {}
  }
}

注意:该语法尚未成为JavaScript语言的正式组成部分(当前处于第3阶段),因此您必须使用Babel这样的编译器来处理它。

thismethod是一流的A,因为这是this在构造函数中指向(因为箭头的功能继承了它们在规定的范围内的情况下):

class A {

  constructor() {

    this.method = () => this;

  }

}



const instance = new A();

console.log(instance.method() === instance); // true

在类上定义常规(非箭头函数)方法会在类原型(而不是实例)上创建方法,但不会设置任何规则this(因为this在JS中是动态的,并且取决于函数的调用方式,而不是函数的调用方式)定义)。

class A {

  method() {}

}



console.log(new A().method === A.prototype.method); // true

如果按照上述两种方法之一定义的方法(通过.)在类实例上被调用,则按照将this函数作为对象的方法调用时绑定方式的规则,this在两种情况下都将指向类实例:

class A {

  constructor() {

    this.methodOnInstance = () => this;

  }

  methodOnPrototype() { return this; }

}



const instance = new A();

console.log(

  instance.methodOnInstance() === instance.methodOnPrototype(), // true

  instance.methodOnPrototype() === instance // true

);

上面两个方法声明之间的主要区别在于,实例方法this 始终
固定在类实例上,而类(原型)方法没有固定(我们可以使用Function.prototype.apply或Function.prototype.call对其进行更改)

class A {

  constructor() {

    this.methodOnInstance = () => this;

  }

  methodOnPrototype() { return this; }

}



const instance = new A();

console.log(

  instance.methodOnInstance() === instance.methodOnPrototype(), // true

  instance.methodOnPrototype.call('new this') === 'new this' // true

);

this更改发生在事件处理程序中的常见情况,其中事件处理程序调用传递给它的函数,并将上下文绑定到发生事件的元素(因此,将的值覆盖为this被单击的元素或活动原为

对于所有(合成)DOM事件处理程序,这也会在React中发生。

因此,如果我们希望方法的上下文始终指向React组件的实例,则可以使用instance方法。

限制上下文但不使用需要Babel的特殊实例方法语法的另一种方法是,通过在具有绑定上下文的类(原型)方法中创建一个新函数(使用Function.prototype.bind)来直接直接创建实例方法:

class A {

  constructor() {

    this.methodOnInstance = this.methodOnPrototype.bind(this);

  }

  methodOnPrototype() { return this; }

}



const instance = new A();

console.log(

  instance.methodOnInstance() === instance.methodOnPrototype(), // true

  instance.methodOnPrototype() === instance // true

);

这使我们可以获得与使用特殊实例方法语法相同的结果,但使用当前可用的工具(ES2017及以下)。

如果由于某种原因我们想要一个始终绑定到不是该类实例的东西的方法,我们也可以这样做:

class A {

  constructor() {

    this.method = this.method.bind(console);

  }

  method() { return this; }

}



const instance = new A();

console.log(

  instance.method() === console // true

);


 类似资料:
  • 新的“胖箭头”符号还可以用更简单的方式来定义匿名函数。 请看下面的例子: console.log(x); incrementedItems.push(x+1); }); 计算一个表达式并返回值的函数可以被定义更简单: 下面代码与上面几乎等价: incrementedItems = items.map(function (x) { return x+1; 让我们在 验

  • 主要内容:1.语法变化,2.带参数的箭头函数,3.带有默认参数的箭头函数,4.带有Rest参数的箭头函数,5.无括号的箭头函数,6.箭头函数的优点ES6中引入了箭头(Arrow)函数,它提供了一种更准确的JavaScript编写方法。 它们让我们能够编写较小的函数语法。 箭头函数的代码更具可读性和结构性。 箭头函数是匿名函数(没有名称且未与标识符绑定的函数)。 它们不返回任何值,并且可以在不使用关键字的情况下进行声明。 箭头函数不能用作构造函数。 箭头函数中的上下文是按词汇或静态方式定义的。 它

  • 问题内容: 我是React的新手,正在尝试了解语法。 我正在React 15环境中进行开发(使用react-starterify模板),并且一直在使用下面的VERSION 2中的语法,但是,我在Facebook的React页面上发现的大多数示例和教程都是VERSION 1。这两个,何时应在另一个之上使用? 版本1 版本2 问题答案: 第二个代码是 无状态功能组件, 并且是用于将组件定义为的函数的新

  • 本文向大家介绍ES6箭头函数的特性?相关面试题,主要包含被问及ES6箭头函数的特性?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: ES6 增加了箭头函数,基本语法为 let func = value => value; 相当于 let func = function (value) { return value; }; 箭头函数与普通函数的区别在于: 1、箭头函数没有this,所以需要通

  • 本文向大家介绍ES6中的箭头函数实例详解,包括了ES6中的箭头函数实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了ES6中的箭头函数。分享给大家供大家参考,具体如下: 语法 我们先来看看箭头函数的语法: param 是参数,根据参数个数不同,分这几种情况: 示例 我们再来看看一些示例,看看在ES5中的函数怎么通过ES6中的箭头函数来替代吧: 当然,也可以定义多个参数: 当然=>后面

  • 本文向大家介绍JavaScript ES6箭头函数使用指南,包括了JavaScript ES6箭头函数使用指南的使用技巧和注意事项,需要的朋友参考一下 胖箭头函数(Fat arrow functions),又称箭头函数,是一个来自ECMAScript 2015(又称ES6)的全新特性。有传闻说,箭头函数的语法=>,是受到了CoffeeScript 的影响,并且它与CoffeeScript中的=>语