请看下面这两段代码:
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 方法,因为 render() 方法内部的 this 会被 React 自动绑定到组件实例上
- 第一个版本成功的原因就在于此
- 第二个版本则失败了,因为 ES6 中的类方法不会被绑定到组件实例上,所以方法内部的 this 会被解析为 undefined
理论上,在第一个版本中会发生以下情况:
- 按钮点击处理程序是一个匿名箭头函数,因此每当我在其中引用 this 时,它会从环境中(在本例中为 render())捕获 this。
- 然后它调用 goToStore 方法,该方法是常规函数。
- 因为这个调用似乎符合隐式绑定的规则(object.function()),所以 object 将成为上下文对象,在这样的函数调用中,它将被用作 this。
- 因此,在 goToStore 方法内部,词法捕获的 this(用作上下文对象)将正确地解析为组件实例。
我感觉情况3和4在这里不适用,因为那样的话就适用于第二种情况:
<button onClick={this.goToStore}>test</button>
同时还有this
上下文对象。
在这种特定情况下,逐步发生了什么?
onClick()
,导致默认绑定规则,即 window。谢谢! - marchello