본문으로 건너뛰기

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 (사진 출처)