해결된 질문
작성
·
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변수에 집중하여 설명하고자 생략한 것이 오히려 혼란을 야기한 것 같네요 ㅠ
다만 클로저로 쓰이지 않는 다른 변수들까지 모두 메모리에 남겨놓는건 성능상 좋지 않기 때문에
최신 자바스크립트 엔진들은 모두 이런 방식으로 최적화를 하고 있습니다.