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 코드 실행에 필요한 요소들을 관리하는 영역이다.실행 컨텍스트는렉시컬 환경을 통해 식별자 바인딩과 상위 스코프 포인터를 저장한다.실행 컨텍스트들은 스택의 형태로 쌓여 코드 실행 순서를 관리할 수 있게 해준다.