클로저란?

⇒ 주로 은닉화 (private variable)

예제

function func () {
    for (var i = 0; i < 5; i++){
        setTimeout(() => console.log(i), 100);
    }
}

func(); //5 5 5 5 5 
  1. setTimeout 반복문의 콜백함수는 task queue에 쌓인다.
  2. 반복문이 끝나면 call stack에 돌아온다.
  3. 콜백함수는 상위 스코프에 i의 값을 가져온다.
  4. 해당 코드의 함수 스코프를 가진다.
  5. 함수 스코프에서 i는 5이다. — 이미 5까지 수행을 마친 상태의 콜스택

해결 방법

새로운 함수 스코프주기

function func() {
  for (var i = 0; i < 5; i++) {
      ((j) => setTimeout(() => console.log(j), 100))(i);
  }
}

func(); // 0 1 2 3 4

→ 새로운 스코프를 형성한다.

→ 콜백함수가 참조할때 즉시 실행 함수 시점의 i를 가진다.