클로저(closure, 폐쇄)

함수가 만들어지는 시점에서 그 부모 함수가 가지고 있는 스코프를 함수가 동봉해서 가지고 있다.

함수와 렉시컬 환경의 조합 함수가 생성될 당시의 외부 변수를 기억 생성 이후에도 계속 접근 가능

스코프 체인(Scope Chain)

변수를 검색할 때 사용되는 스코프의 계층 구조

변수를 참조할 때, 현재 스코프 → 상위 스코프로 이동하며 변수를 찾음

var x = 10;

function outer() {
  var y = 20;

  function inner() {
    var z = 30;
    console.log(x + y + z);
  }

  inner();
}

outer();

inner 해당 스코프에서 참조되는 z

상위 스코프인 outer에서 참조되는 y

전역 스코프에서 참조되는 x

inner 함수의 스코프 체인을 따라 변수를 검색하여 찾음.

클로저

클로저 함수 : 함수 내부에서 정의된 함수, 내부 함수는 외부 함수의 변수에 접근 가능하다.

함수와 해당 함수가 선언된 스코프의 조합

클로저 함수는 자신의 스코프뿐만 아니라 외부 함수의 스코프 체인을 따라 변수 검색 가능

function counter() {
  var count = 0;

  return function() {
    count++;
    console.log(count);
  };
}

var increment = counter();

increment(); // 출력: 1
increment(); // 출력: 2
increment(); // 출력: 3

increament에는 counter에서 반환된 함수가 들어있음

반환된 함수는 외부 함수의 변수인 counter에 접근 가능하다.

스코프