Skip to content

24. 클로저

DD edited this page Aug 14, 2021 · 2 revisions

클로저

함수와 그 함수가 선언된 렉시컬 환경과의 조합

렉시컬 스코프

함수를 어디에 정의했는지에 따라 상위 스코프를 결정하는 것

=> 렉시컬 환경의 외부 렉시컬 환경에 대한 참조"에 저장할 참조값, 즉 상위 스코프에 대한 참조는 함수 정의가 평가되는 시점에 함수가 정의된 환경(위치) 에 의해 결정된다.

상위 스코프 저장

  • 함수는 어디에서 호출되든 자신의 상위 스코프를 기억해야 하고, 이에 대한 참조를 **내부 슬롯Environment**에 저장한다.

  • 이 저장은 함수가 평가되어 함수 객체를 생성할 때 이루어진다.

  • 저장할 참조 객체는 현재 실행중인 실행 컨텍스트의 렉시컬 환경이다.

  • 함수가 호출되어 함수 실행 컨텍스트가 생성되면, 외부 렉시컬 환경에 대한 참조를 결정할 때 해당 함수의 내부 슬롯Environment에 있는 참조가 할당된다.

클로저

  • 함수호출이 종료되어 함수 실행 컨텍스트가 실행 컨텍스트 스택에서 제거 되었을지라도, 해당 함수의 렉시컬 환경까지 소멸하는 것은 아니다. 이 렉시컬 환경을 참조하고 있는 중첩 함수가 존재하는 한, 함수의 렉시컬 환경은 가비지 컬렉터의 대상이 되지 않는다.

  • 자바스크립트의 모든 함수는 상위 스코프를 기억하기 때문에 이론상으로는 모든 함수는 클로저라고 할 수 있지만, 자바스크립트에서 클로저는 상위 스코프의 식별자를 참조하는 중첩함수를 클로저라고 한다. 상위 스코프의 식별자를 참조하지 않으면 중첩함수 일지라도 대부분의 모던 브라우저 최적화에 의해 상위 스코프를 기억하지 않는다

  • 상위 스코프의 식별자를 참조하더라도, 중첩 함수가 외부 함수보다 생명 주기가 짧다면 이 또한 클로저라고 하지 않는다. 생명 주기가 짧다는 것은, 외부함수 내에서만 호출되어 종료됨을 의미한다.

  • 즉 클로저라고 불리기 위해서는

      1. 상위 스코프의 식별자를 참조하면서
      1. 외부 함수보다 생명 주기가 길어야 한다(반환 되거나, 다른 전역 객체에 저장되거나 등)
  • 또한 클로저의 조건을 충족하더라도 자유 변수가 아닌 식별자는 모던 브라우저의 최적화에 의해 기억되지 않는다.

  • 자유 변수란 클로저에 의해 참조되는 상위 스코프의 변수이다.

그 외

  • 함수 표현식은 런타임에 평가 된다