모던 자바스크립트 Deep Dive 23장 실행 컨텍스트를 읽고 구조화해서 정리해보았다.

실행 컨텍스트 (Execution Context)
- 소스코드를 실행하는 데 필요한 환경을 제공하고 코드의 실행 결과를 실제로 관리하는 영역이다.
- 스코프, 식별자, 코드 실행 순서 등을 관리한다.
실행 컨텍스트 스택
- 콜 스택(Call Stack)이라고도 한다.
- 코드의 실행 순서를 관리하는 스택(stack) 자료구조이다.
- 자바스크립트 엔진은 코드를 평가하고 실행 컨텍스트를 생성하여 실행 컨텍스트 스택의 최상위에 push하고, 코드 실행이 종료되면 pop하여 스택에서 제거한다.
- 실행 컨텍스트 스택의 최상위에 존재하는 실행 컨텍스트는 언제나 현재 실행 중인 코드의 실행 컨텍스트(running execution context)이다.
식별자 결정(Idenitifier Resolution)
- 식별자 결정을 위해 식별자를 검색할 때는 실행 중인 실행 컨텍스트에서 식별자를 검색하기 시작하고, 만약 실행 중인 실행 컨텍스트의 렉시컬 환경에서 식별자를 검색할 수 없으면 상위 스코프(외부 렉시컬 환경에 대한 참조가 가리키는 렉시컬 환경)로 이동하여 식별자를 검색한다.
- 전역 렉시컬 환경은 스코프 체인의 종점이므로 전역 렉시컬 환경에서 검색할 수 없는 식별자는 참조 에러(ReferenceError)를 발생시킨다.
렉시컬 환경 (Lexical Environment)
- 식별자와 스코프를 관리한다.
- 식별자와 식별자에 바인딩된 값, 상위 스코프에 대한 참조를 기록하는 자료구조이다.
- 실행 컨텍스트를 구성하는 컴포넌트로,
EnvironmentRecord
와 OuterLexicalEnvironmentReference
컴포넌트로 구성된다.
환경 레코드 (EnvironmentRecord
)
스코프에 포함된 식별자를 등록하고 등록된 식별자에 바인딩된 값을 관리하는 저장소이다.
전역 환경 레코드 (Global Environment Record)
전역 렉시컬 환경을 구성하는 컴포넌트로, 객체 환경 레코드와 선언적 환경 레코드로 구성된다.
객체 환경 레코드 (Object Environment Record)
- 기존의 전역 객체가 관리하던 var 키워드로 선언한 전역 변수와 함수 선언문으로 정의한 전역 함수, 빌트인 전역 프로퍼티와 빌트인 전역 함수, 표준 빌트인 객체를 관리한다.
- 전역 코드 평가 과정에서 var 키워드로 선언한 전역 변수와 함수 선언문으로 정의된 전역 함수는 전역 환경 레코드의 객체 환경 레코드에 연결된 BindingObject를 통해 전역 객체의 프로퍼티와 메서드가 되고, 이때 등록된 식별자를 전역 환경 레코드의 객체 환경 레코드에서 검색하면 전역 객체의 프로퍼티를 검색하여 반환한다.
선언적 환경 레코드 (Declarative Environment Record)
- ES6의 let, const 키워드로 선언한 전역 변수를 관리한다.
- let, const 키워드로 선언한 전역 변수는 전역 객체의 프로퍼티가 되지 않는다.
함수 환경 레코드 (Global Environment Record)
함수 렉시컬 환경을 구성하는 컴포넌트로, 매개변수, arguments 객체, 함수 내부에서 선언한 지역 변수와 중첩 함수를 등록하고 관리한다.
외부 렉시컬 환경에 대한 참조 (OuterLexicalEnvironmentReference
)
- 상위 스코프를 가리킨다.
- 상위 스코프란 외부 렉시컬 환경, 즉 해당 실행 컨텍스트를 생성한 소스코드를 포함하는 상위 코드의 렉시컬 환경을 말한다.
- 외부 렉시컬 환경에 대한 참조를 통해 단방향 링크드 리스트(Linked List)인 스코프 체인을 구현한다.
전역 렉시컬 환경의 외부 렉시컬 환경에 대한 참조
- 전역 코드를 포함하는 소스코드는 없으므로
null
이 할당된다.
- 전역 렉시컬 환경은 스코프 체인의 종점에 존재한다.
함수 렉시컬 환경의 외부 렉시컬 환경에 대한 참조
- 함수를 어디서 호출했는지가 아니라 어디에 정의했는지에 따라 상위 스코프가 결정된다.
- 함수의 상위 스코프를 함수 객체의 내부 슬롯
[[Environment]]
에 저장한다.
실행 컨텍스트가 스택에서 제거되면 렉시컬 환경도 소멸할까?
실행 컨텍스트 스택에서 함수 실행 컨텍스트가 제거되었다고 해서 함수 렉시컬 환경까지 즉시 소멸하는 것은 아니다. 만약 함수 렉시컬 환경을 누군가 참조하고 있다면 함수 렉시컬 환경은 소멸하지 않는다.
렉시컬 환경은 실행 컨텍스트에 의해 참조되기는 하지만 독립적인 객체다. 객체를 포함한 모든 값은 누군가에 의해 참조되지 않을 때 비로소 가비지 컬렉터에 의해 메모리 공간의 확보가 해제되어 소멸한다.