execution context
실행 컨텍스트
란 JavaScript 코드가 실행되는 데 필요한 환경을 제공하고, 코드의 실행 결과를 관리하는 영역이다.
JavaScript 엔진이 코드를 실행할 때 실행 컨텍스트
가 생성된다.
자바스크립트 Deep Dive
책에서는 JavaScript 엔진이 코드를 1. 평가 → 2. 실행
과정으로 나눠서 처리한다고 설명한다. 이 과정은 실행 컨텍스트
의 생성 단계 creation phase
와 실행 단계 execution phase
를 말하는 것이다.
JavaScript 엔진이 코드를 처음 실행하면 글로벌 실행 컨텍스트
를 생성해 다음의 두 단계를 거친다.
window
, Node.js 환경에선 global
) 생성this
객체 생성 후 글로벌 객체에 바인딩undefined
로 초기화된 변수 저장실행 단계
에서 함수가 호출되면 함수 실행 컨텍스트
가 생성된다.
함수 실행 컨텍스트
는 글로벌 실행 컨텍스트
와 같이 생성과 실행 단계를 거치지만,
글로벌 객체를 생성하는 대신 함수에 전달된 파라미터를 지역 변수처럼 사용할 수 있게 해주는
arguments
객체를 생성하고 this
바인딩을 결정한다.
실행 컨텍스트
는 LexicalEnvironment (렉시컬 환경)
, VariableEnvironment
, ThisBinding
으로 구성된다.
실행 컨텍스트
는 내부의 LexicalEnvironment
컴포넌트로 식별자와 스코프를 관리하고,
여러 실행 컨텍스트
가 스택의 형태로 쌓여 코드 실행 순서를 제어한다 (i.e. 실행 컨텍스트 스택
, 콜 스택
).
LexicalEnvironment
내부에는 식별자 바인딩을 관리하는 저장소인 EnvironmentRecord 환경 레코드
와 상위 스코프를 가리키는 OuterLexicalEnvironmentReference
가 있다.
전역 EnvironmentRecord
는 var
키워드로 선언한 전역 변수와 let
, const
키워드로 선언한 전역 변수를 구분하기 위해 Object Environment Record
와 Declarative Environment Record
로 나뉜다.
Object Environment Record
- var
키워드로 선언한 전역 변수, 함수 선언문으로 정의한 전역 함수, 빌트인 전역 프로퍼티, 빌트인 전역 함수, 표준 빌트인 객체 관리
Declarative Environment Record
- let
, const
키워드로 선언한 전역 변수 관리
VariableEnvironment
는 처음 생성시 LexicalEnvironment
와 동일한 값을 가지며 불변적이다.
LexicalEnvironment
는 가변적이다. try...catch
문에서 catch
를 만나면 새로운 LexicalEnvironment
가 생성된다. 이 때 변화된 LexicalEnvironment
에서 기존 LexicalEnvironment
의 식별자를 참조하기 위해 존재하는 것이 VariableEnvironment
이다.
실행 컨텍스트의 생성 단계에서 this
에 바인딩한 객체를 가리킨다.
새로운 실행 컨텍스트
가 생성되면 실행 컨텍스트 스택
에 push
되고, 실행이 끝나게 되면 pop
된다.
맨 위에 위치한 실행 컨텍스트
는 running execution context
, 즉 현재 실행 중인 실행 컨텍스트이다.
코드 흐름에 따라 running execution context
가 계속 변경되며 코드의 실행 순서가 관리된다.
실행 컨텍스트
란 JavaScript 코드 실행에 필요한 요소들을 관리하는 영역이다.실행 컨텍스트
는렉시컬 환경
을 통해 식별자 바인딩과 상위 스코프 포인터를 저장한다.실행 컨텍스트들
은 스택의 형태로 쌓여 코드 실행 순서를 관리할 수 있게 해준다.