
클로저는 기본적으로 함수인데요, 해당 함수의 바깥 스코프에 정의된 변수를 기억하고 이용할 수 있는 함수를 의미합니다.
이것이 특수한 처리로 인해서만 가능하거나 전혀 불가능한 몇몇 언어와 달리, 자바스크립트 모든 함수는 [[Environment]] 프로퍼티를 통해 해당 함수가 생성되던 순간의 Lexical Environment를 기억하고 있습니다. 따라서 자바스크립트 함수는 기본적으로 모두 클로저라고 이야기 할 수 있습니다. (예외: new Function)
Lexical Environment는 무엇인가요?
Lexical Environment는 함수나 코드블럭이 실행될 때 생겨나는 가상의(혹은 개념적으로 존재하는) 객체입니다. 가상의 객체라고 말한 이유는 자바스크립트에 실제로 참조가능한 Lexical Environment라는 이름의 객체가 구현되어 존재하지 않지만 내부 구조적으로 구현되어 작동되는 것이기 때문입니다. 아무튼, 이 Lexical Environment는 Environment Records 와 outer Lexical Environment에 대한 참조 를 가지고 있으며 Environment Records에는 해당 함수(코드블럭) 내부 스코프에서 선언된 변수나 함수가 저장되어 있습니다.
그렇다면 outer scope의 변수는 어떻게 참조되나요?
만약 어떠한 함수가 자신의 내부 스코프에 정의되어 있지 않은 변수를 참조하려 할 때, 해당 함수가 정의된 환경(Lexical Environment)을 기억(실행 컨텍스트가 종료된 경우 [[Environment]]를 통해)하거나 찾아가(아직 컨텍스트가 남아있는 경우 outer Lexcial Environment 참조)서 가져오게 되는 것이고, 이것이 가능한 함수를 클로저라고 부릅니다.