강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của uiseok0514
uiseok0514

câu hỏi đã được viết

JavaScript cốt lõi

đóng cửa

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

Đã giải quyết

Viết

·

438

·

Đã chỉnh sửa

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에 의해 참조 되고 있으므로,

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

 

 

javascript

Câu trả lời 1

1

jaenam님의 프로필 이미지
jaenam
Người chia sẻ kiến thức

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

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

Hình ảnh hồ sơ của uiseok0514
uiseok0514

câu hỏi đã được viết

Đặt câu hỏi