MDN에서의 정의

클로저는 함수와 그 함수가 선언될 당시의 lexical environmnet의 상호관계에 따른 현상

무슨 말인지 바로 알기는 쉽지 않으므로 하나하나 톺아보도록 하자.

선언될 당시의 lexical environment

앞서 배운 실행 컨텍스트 중 outerEnvironmentReference와 같다. 이 객체는 해당 함수가 선언된 컨텍스트의 LexicalEnvironment를 참조한다고 했다. 즉, A라는 컨텍스트 내에 B 함수가 선언되었다면 B 함수의 outerEnvironmentReference는 A의 LexicalEnvironment를 가리키는 것이다. 바로 이를 “선언될 당시의 lexical environment”라고 한다.

상호관계

함수가 늘 상위 컨텍스트의 LexicalEnvironment를 참조하지는 않는다. 내부 함수가 외부 변수를 참조할 때만 선언될 당시의 lexical environment를 참조하고, 이 때가 되어서야 “함수와 함수가 선언될 당시의 lexical environment 간의 상호관계(combination)”가 이루어진다고 할 수 있다.

이제 나름 다시 한 번 정리를 해 보자면, 클로저란

어떤 함수에서 선언한 변수를 내부함수가 참조할 때 발생하는 현상

이라 이야기할 수 있겠다.

아직 명확하진 않으니 예제를 봐 보자.

예제 - 외부 함수의 변수를 내부 함수가 참조 1

var outer = function () {
  var a = 1
  var inner = function () {
    console.log(++a)
  }
  inner()
}

outer() // 2 // => outer()의 실행 컨텍스트가 끝남