지난 포스팅(실행 컨택스트) 을 통해 실행 컨택스트의 동작 원리를 다뤄봤습니다.
이번 포스팅에서는 호이스팅을 다루기 이해해야 할 Lexical Environment
와 EnvironmentRecode
에 대해 다뤄보도록 하겠습니다.
Lexical Environment
는 자바스크립트 코드에서 변수나 함수 등의 식별자를 정의하는데 사용하는 객체로 생각하면 쉽습니다.한국어 번역으로는 정적인 환경
,렉시컬 환경
이라는 단어로 부르기도 하지만 가급적 원워를 문자 그대로 사용하는 편이 좋습니다.Lexical Environment 는 식별자와 참조 혹은 값을 기록하는 EnvironmentRecord
와 outer
라는 또 다른 Lexical Environment를 참조하는 포인터로 구성됩니다. outer
는 외부 Lexical Environment를 참조하는 포인터로, 중첩된 자바스크립트 코드에서 스코프 체인
을 하기 위해 사용합니다.
Environment Record
와 outer
를 조금 더 이해하기 쉽게 구조를 이미지화하여 만들어보았습니다.
그렇다면 위에서 나온 EnvironmentRecord
란 무엇일까요
EnvironmentRecord
(환경 레코드) 는 변수와 함수 선언을 저장하고 관리하는 데 사용되는 내부 데이터 구조입니다.
EnvironmentRecord
는 실행 컨텍스트와 관련이 있으며, 변수와 함수에 접근하고 조작할 수 있는 방법을 제공합니다.
아래 시각화 자료를 통해 작동 원리를 보다 쉽게 알아보겠습니다.
execution context
(실행 컨택스트)가 콜 스택에 담길 때 EnvironmentRecode
(환경 레코드) 도 같이 생성됩니다.
그 후 실행 컨텍스트 생성단계에서 변수와 함수의 결정을 저장합니다.
저장 후 실행단계에서 execution context
(실행컨텍스트)가 변수와 함수에 접근한 뒤 EnvironmentRecord
가 안에 있는 변수를 참조 하게 되면서 호이스팅
의 동작 과정이 이루어 지게 됩니다.
전역 실행 컨텍스트의 경우도 마찬가지로 , 전역 객체(Global Object)와 관련된 EnvironmentRecord가 생성됩니다. 전역 실행 컨텍스트에 있는 변수 함수 등의 실별자를 미리 저장하게 되고 이 전역객체에는 브라우저의 window , node.js의 글로벌 객체 등이 있습니다 전역 객체에 대해 더 궁금하다면 이 글을 참조하길 바랍니다 .