JS | Execution Context: 실행 컨텍스트
Execution Context ( 실행 컨텍스트)
실행 컨텍스트는 실행할 코드에 제공할 환경 정보들을 모아놓은 객체이다. 다르게 말하면 코드가 실행되기 위해 필요한 환경이라고 할 수 있다.
동일한 환경의 코드들을 실행할 때 필요한 환경정보들을 모아 컨텍스트를 구성하고 이를 Call Stack (콜 스택)에 쌓아올리고 최상위에 있는 컨텍스트와 관련된 코드들을 차례대로 실행하는 방식으로 전체 코드의 환경과 순서를 보장하게 된다. Call Stack은 LIFO ( Last In First Out), 즉 후입선출 방식으로 동작한다.
1. 실행 컨텍스트 동작 순서
최초에 전역 컨텍스트가 생성되고, 이 후 함수가 호출될 때마다 컨텍스트가 추가된다.
컨텍스트가 추가되면 VariableEnvironment, LexicalEnvironment, ThisBinding 3가지 정보가 컨텍스트 객체에 담긴다.
이후 함수가 실행되면 함수에서 사용되는 변수들은 변수 객체 안에서 값을 찾고, 없다면 스코프 체인을 따라 올라가며 찾는다.
함수 실행이 끝나면 해당 컨텍스트는 사라진다. (클로저 제외) 페이지가 종료 되면 전역 컨텍스트가 사라지게 된다.
2. 실행 컨텍스트의 3가지 객체
VariableEnvironment
담겨있는 정보는 LexicalEnvironment와 같지만 최초 실행 시의 스냅샷을 유지한다. 실행 컨텍스트를 실행할 때 VariableEnvironment에 정보가 먼저 담기고 이를 복사하여 LexicalEnvironment가 생성된다.
LexicalEnvironment
environmentRecord
현재 컨텍스트와 관련된 코드의 식별자 정보들이 저장된다. 컨텍스트가 실행되기 전 컨텍스트 내부 전체를 처음부터 끝까지 쭉 훑으며 식별자들을 순서대로 수집하게 된다. 즉, 코드가 실행되기도 전에 자바스크립트 엔진은 해당 환경에 속한 코드의 변수명들을 모두 알고 있는 것이다. 이것이 Hoisting (호이스팅) 개념으로 대입되는데 실제 자바스크립트 엔진이 식별자를 끌어올리는 것은 아니지만 편의상 그렇게 간주하여 이해하는 것이다.
outerEnvironmentReference
Scope (스코프) 는 식별자의 유효범위이며, Scope Chain( 스코프 체인) 은 식별자의 유효범위를 안에서부터 바깥으로 차례로 검색해 나가는 것을 의미한다. 이를 가능하게 하는 것이 outerEnvironmentReference이다.
outerEnvironmentReference 는 현재 호출된 함수가 선언될 당시의 LexicalEnvironment를 참조한다. 예를들어 A 함수 내부에 B 함수가 선언되고 B 함수 내부에서 다시 C 함수가 선언 되었을 때, 함수 C의 outerEnvironmentReference 는 함수 B의 LexicalEnvironment 참조하고 함수 B의 outerEnvironmentReference 는 함수 B가 선언되던 때인 함수 A의 LexicalEnvironment을 참조한다.
outerEnvironmentReference는 linked list (연결 리스트)의 형태를 띈다.
따라서 여러 스코프에서 동일한 식별자를 선언한 경우에는 무조건 스코프 체인 상에서 가장 먼저 발견된 식별자에 접근 가능하게 된다.
선언 시점의 LexicalEnvironment를 계속 찾아 올라가면 마지막엔 전역 컨텍스트의 LexicalEnvironment가 있을 것이다.