As the MDN docs states
An arrow function does not have its own this; the this value of the
enclosing execution context is used
So you would think of
onClick={(e) => this.goToStore(e)}
as being an anonymous function which can be written as
(e) => {
return this.goToStore(e)
}
Now here in this anonymous function this
refers to the lexical context of the render function which in turn refers to the React Class instance.
Now
Context is most often determined by how a function is invoked. When a function is called as a method of an object, this is set to the object the method is called on:
var obj = {
foo: function() {
return this;
}
};
obj.foo() === obj; // true
The same principle applies when invoking a function with the new operator to create an instance of an object. When invoked in this manner, the value of this within the scope of the function will be set to the newly created instance:
function foo() {
alert(this);
}
foo() // window
new foo() // foo
When called as an unbound function, this will default to the global context or window object in the browser.
So here since the function is called like this.goToStore()
this inside it will refer to the context of React component.
However when you write onClick={this.goToStore}
, the function is not executed but a reference of it is assigned to the onClick function, which then later invokes it, causing this
to be undefined inside the function as the function runs on the context of the window
object.
Now even though onClick={(e) => this.goToStore(e)}
works, whenever render is called a new function instance is created. In your case its easy to avoid, just by created the function goToStore using arrow function syntax.
goToStore = (e) => {
}
Check the docs for more details on this
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…