해결된 질문
작성
·
9
·
수정됨
0
안녕하세요, 좋은 강의 감사합니다.
실행 컨텍스트 부분에서 궁금한 점이 있어서 질문드립니다. 강의에서 Variable Object를 설명해주셨는데, 제가 개인적으로 찾아본 자료들에서는 ES2015부터 실행 컨텍스트가 Lexical Environment, Variable Environment, this binding으로 구성된다고 나와 있더라고요.
Variable Object는 그 이전 스펙에서 사용되던 용어인 것 같은데, 혹시 강의에서 이 개념을 선택해서 설명하신 특별한 교육적 의도가 있으셨을까요?
제가 아직 깊이 이해하지 못해서 그런데, 두 방식 중 어떤 것이 JavaScript 동작 원리를 학습하는 데 더 도움이 되는지, 또는 어떤 차이점들이 있는지 알려주시면 감사하겠습니다.
답변 1
0
안녕하세요, 좋은 질문 남겨주셔서 감사합니다.
말씀해주신 대로 Variable Object(VO) 와 Variable Environment(VE) 는 같은 실행 컨텍스트의 동작을 설명하는 개념이지만, 명세가 발전하면서 용어와 구조가 달라진 것입니다.
실행 컨텍스트가 생성될 때 함께 만들어지는 내부 객체로,
var
선언
함수 선언
함수 매개변수
들이 VO에 등록됩니다.
실행 컨텍스트의 생성 단계에서 이 값들이 VO에 채워지고,
실행 단계에서는 이 VO를 참조하여 식별자를 조회합니다.
즉, 당시 명세에서는 스코프를 단일 객체(VO)로 표현했다고 보시면 됩니다.
VO 대신 Lexical Environment라는 더 정교한 구조가 도입되었습니다.
Lexical Environment는 두 가지로 이루어져 있습니다:
Environment Record → 실제 변수, 함수, 매개변수가 저장되는 곳
Outer Lexical Environment Reference → 부모 스코프를 가리키는 참조 (스코프 체인)
이 중 Variable Environment는 특별히 var
, 함수 선언, 함수 매개변수를 담는 Environment Record를 의미합니다.
let
, const
같은 블록 스코프 변수는 별도의 Declarative Environment Record에 관리됩니다.
명세의 진화
VO는 ES3 시대 개념
VE는 ES5 이후 도입된 Lexical Environment 체계의 일부
스코프 관리 방식
VO는 단일 객체로 스코프 관리
VE는 계층적 구조를 가지며 스코프 체인을 통해 관리
let/const 처리
VO는 let/const
개념이 반영되지 않음
VE/Lexical Environment는 이를 위한 별도의 구조를 제공
강의에서는 교육적 단순화를 위해 Variable Object 개념을 먼저 사용했습니다.
VO는 “실행 컨텍스트가 변수를 모아두는 저장소”라는 감각을 직관적으로 잡는 데 유리합니다.
이후 ES2015+ 명세에 나오는 Lexical Environment / Variable Environment 개념을 학습하면, VO로 배운 직관을 그대로 확장할 수 있습니다.
정리하면, VO는 이해를 돕기 위한 구개념, VE는 현대 명세의 정식 구조이고,
학습 순서는 VO → VE/Lexical Environment
로 가는 것이 가장 효과적입니다.