실행 컨텍스트는 자바스크립트가 스코프를 기반으로 식별자와 식별자에 바인딩 된 값(식별자 바인딩)을 관리하는 방식과 호이스팅이 발생하는 이유, 클로저의 동작 방식, 이벤트 핸들러와 비동기 처리 방식과 관련되어 있습니다. 따라서, 실행 컨텍스트는 자바스크립트 동작을 담당하는 중요한 개념입니다. 지금부터 자바스크립트의 실행 컨텍스트에 대해서 알아보도록 하겠습니다.
소스코드의 타입
ECMAScript는 4가지의 소스코드가 있습니다. 4가지 타입의 소스코드는 실행 컨텍스트를 생성합니다.
전역 코드: 전역에 존재하는 소스코드.
함수 코드: 함수 내부에 존재하는 소스코드. 함수 내부의 중첩 함수, 클래스 등의 내부 코드는 포함❌
eval 코드: 빌트인 전역 함수인 eval 함수에 인수로 전달되어 실행되는 소스코드.
모듈 코드: 모듈 내부에 존재하는 소스코드.
소스코드를 구분하는 이유는 타입에 따라 실행 컨텍스트를 생성하는 과정과 관리 내용이 다르기 때문입니다.
전역 코드는 전역 변수 관리를 위해 최상위 스코프인 전역 스코프를 생성해야 합니다. 전역 코드가 평가되면 전역 실행 컨텍스트가 생성됩니다.
함수 코드는 지역 스코프를 생성하여 지역 변수, 매개 변수, arguments 객체를 관리해야 합니다. 또한, 지역 스코프를 전역 스코프에서 시작된 스코프 체인에 연결해야 합니다. 이를 위해 함수 코드가 평가되면 함수 실행 컨텍스트가 생성됩니다.
eval 코드는 strict mode에서 자신만의 스코프를 생성하며 eval 코드가 평가되면 eval 실행 컨텍스트가 생성됩니다.
모듈 코드는 모듈별로 독립적인 모듈 스코프를 생성하고 모듈 코드가 평가되면 모듈 실행 컨텍스트가 생성됩니다.
소스코드의 평가와 실행
자바스크립트 엔진은 소스코드의 평가와 소스코드의 실행 과정으로 나뉘어 처리합니다. 소스코드 평가 과정에서는 실행 컨텍스트를 생성하고 변수, 함수 선언문을 실행하여 생성된 변수와 함수 식별자를 키로 실행 컨텍스트가 관리하는 스코프에 등록합니다. 평가 과정 이후 선언문을 제외한 소스코드가 실행되며 ‘런타임’이 시작됩니다. 소스코드의 실행 결과는 실행 컨텍스트가 관리하는 스코프에 등록됩니다.
실행 컨텍스트의 역할
코드가 실행되려면 스코프를 구분하여 식별자와 바인딩 된 값의 관리가 필요하며, 중첩 관계에 의해 스코프 체인을 형성하여 식별자를 검색할 수 있어야 합니다. 또한, 전역 객체의 프로퍼티도 검색 가능해야 합니다. 함수 호출 종료 시 호출 이전으로 돌아가기 위해 현재 실행 중인 코드와 이전에 실행된 코드의 분리된 관리도 필요합니다. 이를 모두 관리하는 역할을 담당하는 것이 실행 컨텍스트입니다. 실행 컨텍스트는 소스코드가 실행되는 데 요구되는 환경 제공하고 코드 실행 결과를 관리하는 영역입니다. 식별자와 스코프는 실행 컨텍스트의 렉시컬 환경으로 관리하고 코드 실행 순서는 실행 컨텍스트 스택을 통해 관리합니다.
실행 컨텍스트 스택
생성된 실행 컨텍스트는 스택에서 관리되며, 이를 실행 컨텍스트 스택이라고 합니다. 코드 실행 시 실행되는 시간의 흐름에 따라 실행 컨텍스트 스택에 추가되거나 제거됩니다. 실행 컨텍스트 스택은 코드의 실행 순서를 관리하며, 실행 컨텍스트 스택의 최상단에 존재하는 실행 컨텍스트는 현재 실행 중인 코드의 실행 컨텍스트입니다.
렉시컬 환경
식별자와 식별자에 바인딩 된 값, 상위 스코프에 대한 참조를 기록하는 자료구조로 실행 컨텍스트를 구성하는 컴포넌트를 렉시컬 환경이라 합니다. 렉시컬 환경은 스코프와 식별자를 관리합니다. 렉시컬 환경은 키와 값을 갖는 객체 형태의 스코프를 생성하여 식별자를 키로 등록하며 바인딩된 값을 관리합니다.
렉시컬 환경은 환경 레코드와 외부 헥시컬 환경에 대한 참조로 구성되어 있습니다.
- 환경 레코드: 스코프의 식별자 등록과 식별자에 바인딩 된 값을 관리하는 저장소
- 외부 렉시컬 환경에 대한 참조: 상위 스코프를 가리키며 참조를 통해 단방향 링크드 리스트 형태의 스코프 체인 구현
실행 컨텍스트의 생성과 식별자 검색 과정
참고
이웅모, ⌈모던 자바스크립트 - Deep Dive⌋, 2020, 23_실행 컨텍스트(p.359 - 387)
