Closure
클로저는 생명 주기가 종료된 상위 스코프의 식별자(자유 변수)를 참조하고 있고, 외부 함수보다 더 오래 생명 주기를 유지하는 중첩 함수이다. 즉 자유 변수에 묶여있는 함수이다. (함수형 프로그래밍 언어에서 사용되는 중요한 특성이다.)
🧑🏻💻 렉시컬 스코프와 환경
✅ 클로저와 렉시컬 스코프
렉시컬(정적) 스코프는 상위 스코프에 대한 참조가 함수가 정의된 위치에 의해 결정되는 것을 말한다.
상위 스코프에 대한 참조는 “외부 렉시컬 환경에 대한 참조”에 저장할 참조값이다.
함수 정의가 평가되는 시점에서의 상위 스코프를 객체의 내부 슬롯[[Enviroment]] 에 저장하기 때문에 렉시컬 스코프 및 클로저 구현이 가능하다.
✅ 클로저와 렉시컬 환경
모든 함수가 기억하는 상위 스코프는 렉시컬 스코프에 의해 결정되므로 함수를 어디서 호출하든 상관 없이 함수는 언제나 자신이 기억하는 상위 스코프의 식별자를 참조할 수도, 식별자에 바인딩된 값을 변경할 수도 있다.
outer 함수의 렉시컬 환경은 inner 함수의 [[Enviroment]] 내부 슬롯에 의해 참조되고 있고 inner 함수는 전역 변수 innerFunc에 의해 참조되고 있으므로 가비지 컬렉션의 대상이 되지 않는다.
const x = 1;
function outer() {
const x = 10;
const inner = function () { console.log(x); };
return inner;
}
const innerFunc = outer();
innerFunc();이처럼 가비지 컬렉터는 누군가 참조하고 있는 메모리 공간을 함부로 해제하지 않는다.
외부 함수보다 더 오래 생존한 중첩 함수는 외부 함수의 실행 컨텍스트의 생존 여부와 상관없이 자신이 정의된 위치에 의해 결정된 상위 스코프를 기억한다.
참고 자료
- 모던 자바스크립트 Deep Dive (사진 출처)