
JavaScript에서 실행 컨텍스트는 코드를 실행하기 위한 환경을 구성하고, 변수나 함수 등의 식별자를 추적하며 실행 흐름을 관리함
ECMAScript 사양은 JavaScript 소스코드를 아래 4가지 타입으로 구분함.
전역 코드 (Global Code)
var, 함수 선언문으로 정의된 식별자는 전역 객체에 프로퍼티로 등록함수 코드 (Function Code)
eval 코드
모듈 코드
실행 컨텍스트는 JavaScript 코드 실행을 위한 환경 정보를 담고 있는 일종의 내부 레코드
구성 요소:
렉시컬 환경 (Lexical Environment):
식별자를 등록하고 검색하는 구조이며, 내부적으로 환경 레코드와 외부 렉시컬 참조로 나
실행 컨텍스트 스택 (EC Stack):
실행 순서를 제어하는 스택 구조로, 현재 실행 중인 컨텍스트는 항상 스택의 최상단에 존재
환경 레코드
var, 함수 선언은 객체 환경 레코드에 등록 → 전역 객체에 프로퍼티로 바인딩let, const는 선언적 환경 레코드에 등록 → TDZ(Temporal Dead Zone) 존재, 선언문 이전 호출 시 <uninitialized>, 레퍼런스 오류 발생this 바인딩
window, global, globalThis)를 참조외부 렉시컬 환경 참조
null변수, 함수 등을 사용할 때 해당 식별자를 어디서 정의했는지 탐색하는 과정
ReferenceError 발생함수 호출 시, 아래 순서로 진행
[[Environment]])var globalVar = 1;
function testFunc() {
var localVar = 2;
console.log(globalVar + localVar);
}
testFunc(); // 출력: 3
현재 함수 스코프부터 검색하여 최상위 스코프까지 탐색함.
이 때, 검색에 실패하면 참조 오류가 발생함.
예를 들어 console.log(전역 변수 + 함수 내부 지역 변수) 일 경우
console에 대한 식별자 결정을 위해 스코프 참조를 타고 전역 객체까지 올라가서 결정 후 프로퍼티, 메서드에서 log를 찾고 전역 변수 식별자 결정을 위해 전역 스코프를 검색하는 방식
console → 전역 객체 탐색globalVar → 전역 스코프에서 발견localVar → 함수 렉시컬 환경에서 발견| 항목 | 설명 |
|---|---|
| 실행 컨텍스트 | 코드 실행을 위한 환경 객체로, 변수, 함수, this 등을 관리함 |
| 전역 컨텍스트 | JS 코드 실행 시 최초로 생성되며, 전역 스코프와 전역 객체를 연결함 |
| 함수 컨텍스트 | 함수 호출 시 생성되며, 지역 변수, 매개변수, arguments 객체 등을 관리함 |
| 렉시컬 환경 | 식별자를 저장하고 참조하는 구조. 내부에 환경 레코드와 외부 참조를 포함 |
| 환경 레코드 | 변수, 함수 선언 등의 실제 정보를 저장하는 객체 |
| 스코프 체인 | 렉시컬 환경의 외부 참조들이 연결된 단방향 리스트 형태 |
| this 바인딩 | 실행 컨텍스트의 종류와 호출 방식에 따라 결정되는 객체 참조 |
| Execution Stack | 실행 중인 실행 컨텍스트를 순서대로 저장하는 스택. 제어 흐름을 결정함 |
| TDZ | let, const 변수는 초기화 전까지 참조할 수 없는 영역 |
| 클로저 | 함수가 정의될 때의 외부 렉시컬 환경을 기억하여 함수 외부에서도 참조 가능하게 함 |