--- id: 실행-컨텍스트(execution-context) title: "실행 컨텍스트(Execution Context)" category: "Frontend" status: "draft" verification_status: "conceptual" canonical_id: "" aliases: - "Execution Context" - "실행 컨텍스트" - "JS Execution Context" - "자바스크립트 실행 환경" duplicate_of: "" source_trust_level: "A" confidence_score: 0.95 created_at: 2026-07-11 updated_at: 2026-07-11 review_reason: "" merge_history: [] tags: ["research", "context 이해 규칙"] raw_sources: - "[S1] Execution Context 실행 컨텍스트를 알아야하는 이유? - 넥스트리" - "[S2] JavaScript Execution Context – How JS Works Behind the Scenes - freeCodeCamp" applied_in: [] github_commit: "" --- # [[실행 컨텍스트(Execution Context)]] ## 🎯 한 줄 통찰 (One-line insight) 자바스크립트 코드가 평가되고 실행되는 환경으로, 변수, 스코프, 호이스팅 및 `this` 바인딩 등 코드 실행에 필요한 모든 상태와 정보를 담고 있는 핵심 객체이다. ## 🧠 핵심 개념 (Core concepts) - **콜 스택(Call Stack)**: 생성된 실행 컨텍스트들을 순차적으로 쌓아 올리고 제거(Push/Pop)하여 코드의 실행 순서와 흐름을 보장하는 스택 구조. - **Variable & Lexical Environment**: 컨텍스트 내의 식별자 정보를 저장하는 `environmentRecord`와 상위 스코프를 참조하는 `outerEnvironmentReference`로 구성된 환경 객체. - **생성 및 실행 단계(Creation & Execution Phase)**: 코드 실행 전 메모리를 할당하고 스코프 체인을 설정하는 '생성 단계(호이스팅 수행)'와 이후 한 줄씩 코드를 평가하며 실제 동작을 수행하는 '실행 단계'. - **this 바인딩**: 함수의 선언 위치가 아닌, 함수가 어떻게 호출되느냐(일반 호출, 메서드 호출 등)에 따라 동적으로 객체를 연결하는 과정. ## 🧩 추출된 패턴 (Extracted patterns) - **스택 기반 실행 제어(Stack-based Execution Control)**: 전역 컨텍스트가 먼저 콜 스택에 푸시되고, 함수가 호출될 때마다 새로운 함수 실행 컨텍스트가 최상단에 푸시되며 종료 시 팝(Pop)되는 후입선출(LIFO) 패턴. - **스코프 체이닝(Scope Chaining)**: 특정 변수를 찾을 때 현재의 `Lexical Environment`를 먼저 검색하고, 없으면 `outerEnvironmentReference`를 통해 상위 스코프로 거슬러 올라가며 탐색하는 패턴. ## 📖 세부 내용 (Details) - **실행 컨텍스트의 정의 및 종류** 실행 컨텍스트는 자바스크립트 엔진이 스크립트를 스캔한 후, 코드를 변환하고 실행하는 과정을 관리하는 전반적인 환경이다 [S1, S2]. 이 환경은 실행할 코드에 전달할 모든 정보를 담고 있는 객체로, 스크립트 실행 시 최초로 생성되는 **전역 실행 컨텍스트(Global Execution Context)**와 함수가 호출될 때마다 생성되는 **함수 실행 컨텍스트(Function Execution Context)**로 나뉜다 [S1, S2]. - **실행 컨텍스트의 처리 단계** 실행 컨텍스트는 두 가지 주요 단계를 거쳐 처리된다. 1. **생성 단계(Creation phase)**: 자바스크립트 엔진이 환경을 구성하는 단계로, 변수와 함수에 대한 메모리를 할당하고 스코프 체인을 설정한다 [S2]. 이 단계에서 현재 컨텍스트와 관련된 모든 식별자 정보가 `environmentRecord`에 수집되며, 이러한 작동 방식이 바로 **호이스팅(Hoisting)**이다 [S1]. 2. **실행 단계(Execution phase)**: 엔진이 코드를 위에서 아래로 한 줄씩 읽어내려가며 실행한다 [S2]. 변수에 실제 값을 할당하고 함수 호출 및 표현식 평가를 수행한다 [S2]. - **실행 컨텍스트의 내부 구조** 실행 컨텍스트 내부는 주로 `Variable Environment`와 `Lexical Environment`로 구성된다 [S1]. - `Variable Environment`: 최초 생성 시점의 스냅샷 상태를 유지하며 참조를 제공한다 [S1]. - `Lexical Environment`: `Variable Environment`의 정보를 복사하여 생성되지만, 코드 실행 중 발생하는 블록 내 변수 할당 등 런타임의 동적인 변화를 실시간으로 반영한다 [S1]. 두 환경 모두 식별자 정보를 담는 `environmentRecord`와 상위 스코프(부모 스코프)를 참조하여 스코프 체이닝을 가능하게 하는 `outerEnvironmentReference`를 포함한다 [S1]. - **콜 스택(Call Stack)의 역할** 자바스크립트 엔진은 생성된 전역 및 함수 컨텍스트들을 추적하고 순서를 보장하기 위해 콜 스택(Call Stack)이라는 자료구조를 사용한다 [S1, S2]. 콜 스택은 고정된 크기를 가지며, 종료 조건이 없는 재귀 함수 호출 등으로 인해 허용된 컨텍스트 제한을 초과하면 스택 오버플로우(Stack Overflow) 에러가 발생한다 [S2]. - **this 바인딩** `this` 바인딩은 렉시컬 스코프(Lexical Scope)처럼 함수가 정의된 위치에 따라 결정되는 것이 아니라, 함수가 **어디서 어떻게 호출되느냐**에 따라 전역 객체, 메서드를 호출한 객체, 새로 생성된 인스턴스 등으로 동적으로 바인딩된다 [S1]. ## ⚖️ 모순 및 업데이트 (Contradictions & updates) 소스에서 상충되는 정보나 기존 상식과 다른 내용은 확인되지 않음. ## 🛠️ 적용 사례 (Applied in summary) 현재 발견된 실제 적용 사례가 없습니다. (소스 내에 파일 경로, 커밋 해시, 프로젝트 아키텍처에 적용된 구체적 실무 사례는 명시되어 있지 않음.) ## 💻 코드 패턴 (Code patterns) 자바스크립트(ES6)에서 함수 호출을 통한 실행 컨텍스트의 렉시컬 스코프 탐색(`outerEnvironmentReference`)을 보여주는 구조 예시. ```javascript // 상위 스코프(전역) let greeting = 'Hello'; function petInfo() { // 내부 Lexical Environment let cat = 'cat'; let dog = 'dog'; // cat과 dog는 현재 컨텍스트의 environmentRecord에서 찾음 // greeting은 outerEnvironmentReference를 통해 전역 스코프에서 찾음 console.log(greeting, cat, dog); } petInfo(); // 새로운 함수 실행 컨텍스트 생성 후 콜 스택에 push ``` ## ✅ 검증 상태 및 신뢰도 - **상태:** draft - **검증 단계:** conceptual - **출처 신뢰도:** A - **신뢰 점수:** 0.95 - **중복 검사 결과:** 신규 생성 (New discovery) ## 🔗 관련 문서 링크 (Related document links) ### 상위/유사 개념 - [[콜 스택(Call Stack)]] — 실행 컨텍스트를 저장하고 LIFO 방식으로 코드 실행 순서를 제어하는 구조 - [[스코프(Scope)]] — 실행 컨텍스트의 `outerEnvironmentReference`에 의해 탐색 가능해지는 식별자의 유효 범위 - [[호이스팅(Hoisting)]] — 컨텍스트 생성 단계에서 `environmentRecord`에 식별자를 미리 수집하는 동작 - [[클로저(Closure)]] — 외부 실행 컨텍스트가 종료되었음에도 `Lexical Environment`가 유지되어 내부 함수가 상위 환경을 참조하는 현상 ### 심층 후속 질문 (Deeper Research Questions) - Lexical Environment와 Variable Environment는 V8 등 실제 자바스크립트 엔진 메모리 상에서 어떻게 다르게 관리되는가? - 비동기 콜백 함수나 프로미스(Promise)는 콜 스택 및 실행 컨텍스트의 제어권과 어떻게 상호작용하는가? - 블록 스코프(`let`, `const`)와 함수 스코프(`var`)는 Lexical Environment의 런타임 업데이트 과정에서 구체적으로 어떻게 다르게 취급되는가? - 실행 컨텍스트 스택 사이즈가 초과(Stack Overflow)되는 것을 방지하기 위해 꼬리 재귀 최적화(Tail Call Optimization)는 실행 컨텍스트를 어떻게 조작하는가? - 화살표 함수(Arrow Function)가 고유의 `this` 실행 컨텍스트를 생성하지 않고 상위 환경을 상속받는 내부 엔진의 처리 로직은 무엇인가? ### 실무 적용 맥락 (Practical Application Contexts) - **Implementation:** 비동기 콜백이나 내부 함수에서 의도치 않게 전역 객체로 `this`가 바인딩되는 오류 디버깅 및 회피. - **System Design:** 이벤트 루프 및 비동기 I/O 아키텍처에서 콜 스택의 점유 시간을 최소화하는 비차단(Non-blocking) 로직 설계. - **Operation / Maintenance:** 가비지 컬렉터(Garbage Collector)와 연동된 렉시컬 스코프 메모리 해제를 통한 애플리케이션 메모리 누수(Memory Leak) 방지. - **Learning Path:** 자바스크립트 동작 원리 이해 -> 스코프 및 호이스팅 원리 파악 -> 클로저 및 비동기(Promise) 프로그래밍 마스터. ### 인접 주변 주제 (Adjacent Topics) - [[이벤트 루프(Event Loop)]] — 확장 방향: 콜 스택이 비워졌을 때 태스크 큐의 함수 실행 컨텍스트를 생성하여 스택으로 푸시하는 동시성 모델. - [[가비지 컬렉션(Garbage Collection)]] — 확장 방향: 실행 컨텍스트가 종료된 후 `Lexical Environment`의 참조 여부에 따른 메모리 해제 메커니즘. ## 🔗 지식 그래프 (Knowledge Graph) - **상위/루트:** [[context 이해 규칙]] - **관련 개념:** [[콜 스택]], [[스코프]], [[클로저]] - **참조 맥락:** 자바스크립트의 변수 참조 범위, 비동기 함수의 실행 순서, `this` 바인딩 오류 등 코드 동작 원리를 깊이 이해하고 디버깅할 때 참조. ## 📚 출처 (Sources) - [S1] Execution Context 실행 컨텍스트를 알아야하는 이유? - 넥스트리 - [S2] JavaScript Execution Context – How JS Works Behind the Scenes - freeCodeCamp ## 📝 변경 이력 (Change history) - 2026-07-11: Initial draft generated via Datacollector_MAC P-Reinforce engine.