в первой строке
<button onClick={this.handleClick()}>click 1</button>
this.handleClick()
будет выполняться в функции render
компонента App
(который сам по себе является class
), пока компонент отображается в виртуальном DOM. Таким образом, к моменту выполнения функция handleClick
будет определена в контексте выполнения, который является App
class.
Во второй строке
<button onClick={this.handleClick}>click 1</button>
this.handleClick
присоединен к DOM и будет выполняться из контекста DOM, когда произойдет событие click, и выполнение будет искать handleClick в контексте DOM и будет undefined
.
Есть два способа обойти это
bind
метод для класса, как вы сделали.
Передайте анонимную функцию, которая будет выполняться без контекста DOM и по умолчанию будет привязана к контексту вызывающего.
вот так
<button onClick={(e) => this.handleClick(e)}>click 1</button>