javascript - Javascript 类语法并在方法中绑定 this
问题描述
我想了解以下语法如何工作之间的基本区别。
// 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 等
解决方案
类字段 - 即直接在类主体内定义的属性 - 本质上只是构造函数内相同事物的语法糖。所以这:
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)
someFn
调用上下文也将失败myObj
- 浏览器只知道调用传递给点击侦听器的回调;myObj
像这样传递时,调用上下文会丢失。
推荐阅读
- java - maven-bundle-plugin 因“无效的类文件 module-info.class”而失败
- php - 计算每 2 行的时间戳之间的时间
- java - 如何在spring boot中创建动态规则引擎?
- java - 为硒设置代理?
- java - 文件大小的递归平均值[JAVA]
- javascript - 有什么方法可以检查 Javascript 变量的内存地址吗?
- android - 如何在AndroidStudio中为android库的androidTest添加资源
- mean - 计算平均分
- arrays - 数组内的 Fortran 数组
- entity-framework-core - EF Core 2.1 在内存数据库中不更新记录