【问题标题】:Javascript class syntax and binding this in methods [duplicate]Javascript类语法并将其绑定在方法中[重复]
【发布时间】:2020-12-09 04:49:49
【问题描述】:

我想了解以下语法工作方式之间的基本区别。

// Syntax 1
class Component extends React.Component {
  constructor(props) {
    super(props)
    this.handleClick = this.handleClick.bind(this)
  }

  handleClick() {
    // ...
  }
}

// Syntax 2

handleClick = () => {
  console.log('this is:', this)
}
<button onClick={this.handleClick}>
  {'Click me'}
</button>

虽然语法 1 需要在构造函数中指定显式绑定。但是,似乎不需要语法 2。 语法2是如何实现自动绑定的?

我假设这种理解/语法可以扩展到任何框架,包括 React、Angular、Ember 等

【问题讨论】:

  • 在语法 1 中,您使用的是普通函数,然后显式调用 .bind()。在语法 2 中,您使用的是箭头函数,它会自动为您执行绑定,因此您不必调用 .bind()。

标签: javascript reactjs ecmascript-6


【解决方案1】:

类字段 - 即直接在类主体内定义的属性 - 本质上只是构造函数内相同事物的语法糖。所以,这个:

class Something {
  handleClick = () => {
    console.log('this is:', this)
  }
}

是,脱糖的:

class Something {
  constructor() {
    this.handleClick = () => {
      console.log('this is:', this)
    };
  }
}

去掉加糖,应该清楚发生了什么 - 箭头函数表示this 指的是构造函数中的this,即实例本身,不需要绑定。

这不仅仅是一个 React 或框架的东西 - 这些是 vanilla JavaScript 中的标准规则。

如果你不绑定方法或使用箭头函数或类似的东西,那么:

<button onClick={this.handleClick}>

失败的原因与

someButton.addEventListener('click', myObj.someFn)

也将无法使用myObj 的调用上下文调用someFn - 浏览器只知道调用传递给点击监听器的回调; myObj 的调用上下文在这样传递时会丢失。

【讨论】:

  • 谢谢...所以当我们再次说“类字段”时,它们都是语法 1/2 中使用的“handleClick”而不是类字段...。您的定义也指出“直接定义的属性”在类体内”
  • 确实,在第一个版本中,handleClick 不是类字段,而是Component.prototype 上的方法。它不是内置正确调用上下文的箭头函数。
  • 我不确定 OP 是否曾经在原始问题中谈论过类字段。我对语法 2 的理解是,所有这些都在渲染函数中。
  • @ScottyJamison handleClick = () =&gt; { 在我看来真的像是使用类字段。如果不是,我想它前面会有一个const。这看起来都在一个类组件中,而不是一个功能组件
  • @CertainPerformance - 关于你的 someButton.addEventListener('click', myObj.someFn) 的例子,我假设你指的是非常基本的 JS 工作......但是你想要的任何快速参考指给我参考...
猜你喜欢
  • 2016-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
  • 1970-01-01
相关资源
最近更新 更多