실행 컨텍스트란?
실행 컨텍스트 (execution context)
실행할 코드에 제공할 환경 정보들을 모아놓은 객체.
자바스크립트의 동적 언어로서의 성격을 가장 잘 파악할 수 있는 개념이다
실행 컨텍스트는 자바스크립트 코드가 실행되는 환경이다.
모든 자바스크립트 코드는 실행 컨텍스트 내부에서 실행된다.
즉, 함수가 실행되면 함수 실행에 해당하는 실행 컨텍스트가 생성되고, 자바스크립트 엔진에 있는 콜 스택에 차곡차곡 쌓인다.
그리고 가장 위에 쌓여있는 컨텍스트와 관련 있는 코드를 실행하면서 (LIFO) 전체 코드의 환경과 순서를 보장하게 된다.
실행 컨텍스트는 식별자(변수, 함수, 클래스 등의 이름)를 등록하고 관리하는 스코프와 코드 실행 순서 관리를 구현한 내부 메커니즘으로, 곧 자바스크립트의 핵심 원리다.
언제 생성될까?
자바스크립트 엔진이 스크립트를 처음 마주할 때 전역 컨텍스트를 생성하고, 콜 스택에 push 한다.
엔진이 스크립트를 쭉 읽어내려가면서 함수 호출을 발견할 때마다 함수의 실행 컨텍스트를 스택에 push 한다.
중요한 점은 함수 실행 컨텍스트는 함수가 실행될 때 만들어진다는 것이다.
실행 컨텍스트를 만들 수 있는 방법은
- 전역 공간
- 함수
- eval()
eval은 문자열로 된 자바스크립트 코드를 전달하면 그대로 실행되는 함수인데, 속도나 보안이 좋지 않아 쓰지 않는다
실행 컨텍스트가 생성되는 시점은 곧 함수를 실행하는 시점..
실행 컨텍스트의 종류
- 전역 실행 컨텍스트
- 함수 실행 컨텍스트
- eval 실행 컨텍스트
실행 컨텍스트의 구조
LexicalEnvironment 컴포넌트와 variableEnvironment 컴포넌트로 구성된다.
variableEnvironment
현재 컨텍스트 내의 식발자들에 대한 정보, 외부 환경 정보를 담는다. 스냅샷 유지를 목적으로 사용한다.
실행 컨텍스트를 생성할 때 variableEnvironment 에 정보를 먼저 담은 다음, 이를 복사해서 LexicalEnvironment를 만든다
LexicalEnvironment 렉시컬 환경(어휘적 환경)
식별자와 식별자에 바인딩된 값, 그리고 상위 스코프에 대한 참조를 기록하는 자료구조로 실행 컨텍스트를 구성하는 컴포넌트. 처음에는 variableEnvironment와 같지만 변경사항이 실시간으로 반영된다.
실행 컴포넌트 스택이 코드의 실행 순서를 관리한다면 렉시컬 환경은 스코프와 식별자를 관리한다.
키와 값을 갖는 객체 형태의 스코프를 생성해서, 식별자를 키로 등록하고 식별자에 바인딩된 값을 관리한다.
ㅡ environmentRecord(환경 레코드)
함수 안의 코드가 실행되기 전에 현재 컨텍스트와 관련된 코드의 식별자 정보가 저장된다 (매개변수 이름, 함수 선언, 변수명 등)
즉 코드가 실행되기 전에 자바스크립트 엔진은 이미 해당 환경에 속한 코드의 변수명을 모두 알고 있게 된다 (호이스팅)
ㅡ outerEnvironmentReference(외부 렉시컬 환경에 대한 참조)
상위 스코프를 가리킨다. outerEnvironmentReference에 의하여 스코프와 스코프체인이 형성된다.
따라서 자바스크립트 엔진이 현재 렉시컬 환경에서 변수를 찾을 수 없다면 외부 환경에서 찾는다는 것을 뜻한다. 상위 스코프에서도 해당 식별자를 찾을 수 없다면 참조 에러(uncaught reference error)를 발생시킨다.
ThisBinding
this 식별자가 바라봐야 할 대상 객체. 실행 컨텍스트가 활성될 때 this 가 지정되지 않은 경우 this 에는 전역 객체가 저장된다.
함수가 호출되면 전역 공간에 있던 코드의 제어권이 함수의 내부로 이동하면서 다음과 같은 순서로 함수 코드를 평가한다.
- 함수 실행 컨텍스트 생성
- 함수 LexicalEnvironment 생성
- 함수 environmentRecord 생성
- ThisBinding
- outerEnvironmentReference 결정
reference