我了解this
绑定的一般理论(重要的函数调用站点、隐式、显式绑定等...)以及在 React 中解决此绑定问题的方法,因此它始终指向我想要this
成为的对象(绑定在构造函数、箭头函数等),但我正在努力获得内部机制。
看一下这两段代码:
class demo extends React.component {
goToStore(event) {
console.log(this)
}
render() {
<button onClick={(e) => this.goToStore(e)}>test</button>
}
}
对比
class demo extends React.component {
goToStore(event) {
console.log(this)
}
render() {
<button onClick={this.goToStore}>test</button>
}
}
我所知道的是:
- 在两个版本中,我们最终都成功地使用了 goToStore 方法,因为
this
该render()
方法内部自动绑定(通过 React)到组件实例 - 因为第一个成功,
- 第二个失败,因为es6中的类方法没有绑定到组件实例,因此
this
在方法中解析为undefined
据我了解,理论上在第一个版本中,会发生以下情况:
- 按钮单击处理程序是一个匿名箭头函数,因此每当我在其中引用
this
时,它都会this
从环境中获取(在本例中来自render()
) - 然后它调用该
goToStore
方法,即一个常规函数。 - 因为调用似乎符合隐式绑定的规则 (
object.function()
)object
将是上下文对象,并且在这样的函数调用中它将被用作this
- 因此,在该
goToStore
方法中,词法拾取 this(用作上下文对象)将正确解析为组件实例
我觉得 3. 和 4. 不是这里的情况,因为它会适用于 2. 情况:
<button onClick={this.goToStore}>test</button>
也与this
上下文对象。
在这个特殊情况下,一步一步到底发生了什么?