인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

yus님의 프로필 이미지
yus

작성한 질문수

코어 자바스크립트

클로저 (closure)

실행 컨텍스트와 클로저에 대해 질문드립니다.

해결된 질문

작성

·

344

·

수정됨

1

안녕하세요

클로저에 대해 명확한 이해가 되지 않아서 질문 드립니다.

 

전역, outer, inner 함수가 있다고 가정할 때,

 

outer 함수가 실행되면, outer의 LexicalEnviroment이 생길것이고,

그 내부에는 enviromentRecord와 outerEnviromentRef 가 생길 것입니다.

 

enviromentRecord에는 inner 함수도 포함이 될 것이고,

inner 함수는 outer 함수 내부에서 선언되었으므로,

inner 함수의 [[Enviroment]] 슬롯은 outer 컨텍스트의 LexicalEnviroment를 참조할 것입니다.

 

따라서 outer컨텍스트가 종료 되어도 inner함수의 [[Enviroment]] 슬롯이

outer 컨텍스트의 LexicalEnviroment를 참조하고 있기 때문에 GC 의 대상이 되지않고,

(outer컨텍스트가 없어진 후에) inner 컨텍스트가 생성되어도

정상적으로 inner의 outerEnviromentRef가 outer의 LexicalEnviroment를 참조할 수 있을 것입니다.

 

outer LexcialEnviroment는 enviromentRecord와 outerEnviromentRef를 참조하고 있으므로,

이 두 객체는 없어지지 않아야 할 것 같은데,

강의 5:15 에서 outer의 enviromentRecord와 outerEnviromentRef는 a:1 을 제외하고

모두 제거 되고 있습니다.

 

제 생각에는 참조의 과정을 따라가면 객체 내부의 프로퍼티가 남는게 아니라

객체(enviromentRecord나 outerEnviromentRef 그 자체) 가 남아야 할 것 같은데,

저렇게 일부를 제외하고 다 지워지는 이유가 있을까요?

 

a와 inner 는 outer enviromentRecord에서 참조하고 있고,

enviromentRecord와 outerEnviromentRef는 LexcialEnviroment에 의해 참조되며

 

LexcialEnviroment는 다시 inner 함수의 [[Enviroment]] 또는

inner 컨텍스트의 outerEnviromentRef에 의해 참조 되고 있으므로,

다 살아남아야 하는 것이 아닌가 생각됩니다.

 

 

답변 1

0

정재남님의 프로필 이미지
정재남
지식공유자

이론상으로 유추하신게 맞습니다.
a변수에 집중하여 설명하고자 생략한 것이 오히려 혼란을 야기한 것 같네요 ㅠ

다만 클로저로 쓰이지 않는 다른 변수들까지 모두 메모리에 남겨놓는건 성능상 좋지 않기 때문에
최신 자바스크립트 엔진들은 모두 이런 방식으로 최적화를 하고 있습니다.

yus님의 프로필 이미지
yus

작성한 질문수

질문하기