[요약]

[매 렌더마다 고유의 prop과 state값을 가진다]

[매 렌더마다 고유의 이벤트 핸들러를 가진다]

[매 렌더마다 고유의 이펙트를 가진다]

[매 렌더는 고유의 모든 것을 가진다]

function Counter() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    setTimeout(() => {
      console.log(`You clicked ${count} times`);
    }, 3000);
  });
  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

// 순차적으로 누를시 1 2 3 4 5 이렇게 뜬다

...
componentDidUpdate() {
  setTimeout(() => {
     console.log(`You clicked ${this.state.count} times`);
  }, 3000);
}
...

// 순차적으로 누를시 5 5 5 5 5 이렇게 뜬다
// this.state.count 는 언제나 최신의 값을 가리킨다

// 클래스형 컴포넌트는 전통적으로 타임아웃에서 잘못된 값을 가져오는 문제가 있다
// 이런 차이가 생기는 이유는 클로저 자체의 문제가 아닌 가변값 변경(mutation)이다
// 클래스형 컴포넌트에서는 this.state 가 최신 상태를 가리키도록 변경한다
// 클로저는 접근하려는 값이 절대 바뀌지 않을 때(상수) 유용하다
// 훅은 클로저에 많이 의존을한다

[흐름을 거슬러 올라가기]