JS 실행컨텍스트와 렉시컬환경, 그리고 환경레코드의 구분.

2024-04-07

실행컨텍스트(Execution Context), 렉시컬 환경(Lexical Environment), 환경 레코드(Environment Record)

모두 JS에서 식별자를 변수와 매칭 (즉, 식별(identify)) 하기 위한 자료구조입니다.

ECMAScript 2025 스펙을 읽어보면 렉시컬환경 외에도 환경레코드(Environment Record)라는 용어가 등장합니다.

아래는 ECMAScript 2025(https://tc39.es/ecma262) 스펙입니다.

실행컨텍스트는 기본적으로

위 컴포넌트들을 가집니다.

Lexical Environment는 let,const로 선언된 변수를 바인딩할때 사용하는 컴포넌트이고, Variable Environment는 var로 선언된 변수를 바인딩 할 때 쓰입니다. var과 let,const의 스코프차이는 여기에서 기인합니다.

두 환경의 자료형(type)은 그저 Environment Record이며, 렉시컬환경과, VariableEnvironment라는 용어는 그저 실행컨텍스트에 올라간 컴포넌트 명(필드명)에 불과합니다.

참고로 이부분은 ECMAScript 2021에서 큰 변화가 있었습니다. 본 포스팅은 2021년 이후~2025까지의 최신 ECMAScript를 기준으로 작성되었습니다. 참고(stackoverflow - 렉시컬환경과 환경레코드의 차이. 그리고 ~2020 vs 2021에서 생긴 차이)

ECMAScript의 코드는 어디에 저장되는가?

ECMASCript가 실행할 코드는 실행컨텍스트에서 참조합니다. 실행할 코드는 크게 3종류로 분류할 수 있는데, 함수, 스크립트, 모듈입니다. 실행컨텍스트는 필드 Function(function object), ScriptOrModule(ScriptRecord, ModuleRecord)를 가집니다.

이 function object, ScriptRecord, ModuleRecord의 내부필드 [[ECMAScriptCode]]에 파싱된 소스코드(source text)를 담고 있습니다.