正如 MDN 文档所述
箭头函数没有自己的 this;的这个值
使用封闭的执行上下文
所以你会想到
onClick={(e) => this.goToStore(e)}
作为一个匿名函数,可以写成
(e) => {
return this.goToStore(e)
}
现在在这个匿名函数中this
指的是渲染函数的词法上下文,而渲染函数又指的是 React 类实例。
Now
Context通常由函数的调用方式决定。当函数作为对象的方法被调用时,this 被设置为调用该方法的对象:
var obj = {
foo: function() {
return this;
}
};
obj.foo() === obj; // true
当使用 new 运算符调用函数来创建对象的实例时,同样的原则也适用。当以这种方式调用时,函数范围内的 this 值将被设置为新创建的实例:
function foo() {
alert(this);
}
foo() // window
new foo() // foo
当作为未绑定函数调用时,这将默认为浏览器中的全局上下文或窗口对象。
所以这里因为该函数被称为this.goToStore()
其中的 this 将引用 React 组件的上下文。
然而当你写onClick={this.goToStore}
,该函数没有执行,但它的引用被分配给 onClick 函数,然后该函数稍后调用它,导致this
当函数在函数的上下文中运行时,函数内部未定义window
object.
现在尽管onClick={(e) => this.goToStore(e)}
每当调用 render 时都会创建一个新的函数实例。在您的情况下,很容易避免,只需使用箭头函数语法创建函数 goToStore 即可。
goToStore = (e) => {
}
检查文档以获取更多详细信息this https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this