[JS] 실행컨텍스트
1. 실행 컨텍스트(Execution Context): 자바스크립트 코드가 실행되는 환경/문맥(Context)
실행 컨텍스트는 자바스크립트 엔진이 코드를 해석하고 실행하기 위해 필요한 정보들을 담고 있는 객체
: 이걸 무슨 말인지 구체적으로 풀어보면..
자바스크립트 엔진이 코드를 실행하려면, 그 코드가 무엇을 참조해야 하고, 어떤 값을 사용해야 하며, 누가 호출했고, this가 뭔지, 이런 정보들을 전부 기억하고 있어야함 그래서 엔진은 코드를 실행하기 전에,
“지금 이 함수 안에서 어떤 변수들이 있지?”
“외부에서 참조할 수 있는 건 뭐지?”
“this는 뭘 가리키지?”
이런 걸 담아두는 일종의 정보 묶음을 만들어 놓는데, 이게 바로 실행 컨텍스트
실행 컨텍스트 = 함수의 작업 가방
함수를 호출하면 자바스크립트는 그 함수를 실행하기 위한 가방(=컨텍스트)을 하나 꺼냄
📄 변수 목록 | 선언된 변수들 (let, var, const) |
🧭 함수 목록 | 선언된 내부 함수들 |
🗺 스코프 | 이 함수가 어떤 외부 변수에 접근 가능한지 |
🔑 this | this가 누구를 가리키는지 |
🎟 arguments | 함수에 전달된 실제 인자들 |
가방 안에 있는 걸 기반으로 코드를 한 줄씩 실행함
예시로 보기
function greet(name) {
const message = "Hello, " + name;
console.log(message);
}
greet("Alice");
함수 greet("Alice")를 실행하면
- 자바스크립트는 이 함수만의 실행 컨텍스트를 만듦
- 그 안에는 이런 정보들이 들어감
- name = "Alice"
- message = 아직 할당 전
- this = window
즉, 자바스크립트는 이 함수가 실행되는 동안 필요한 모든 정보를 하나의 묶음으로 보관하면서 실행을 진행
사실 이것도 추상적으로 표현한 거라 좀 더 구체적으로 보자.
실제 가방 안엔 이런 것들이 있다.
Variable Environment | VE: 변수 선언, 초기화 등을 저장 LE: 스코프 체인, 참조 대상 추적 이라고 GPT 가 하는데, 이부분은 설명이 잘못된 것 같아 수정이 필요함 아래 설명으로 보는 게 나을듯 |
Lexical Environment | |
This Binding |
GPT 왈: 실제 자바스크립트 엔진은 Lexical Environment 하나로 거의 다 처리하고, Variable Environment는 과거 개념이라고한다.
최신 설명에서는 Lexical Environment만 강조하기도 한다함
+ environmentRecord, outerEnvironmentReference
Variable Environment, Lexical Environment 에는 각각 environmentRecord, outerEnvironmentReference 가 담겨있다
Environment Record | 현재 컨텍스트에서 선언된 변수, 함수 등을 저장 (식별자 정보) |
Outer Environment Reference | 상위 컨텍스트를 참조하기 위한 링크 (스코프 체인의 핵심) |
Lexical Environment | 위 둘을 합친 구조. 현재 스코프와 스코프 체인 정보 전체 |
요약 정리
- 실행 컨텍스트는 코드를 실행할 때 필요한 모든 정보들을 묶어둔 공간
- 자바스크립트는 전역 코드, 함수, eval 등 각각에 대해 실행 컨텍스트를 따로 만든다
- 이 컨텍스트 안에는 변수, 스코프, this, arguments 같은 실행에 필요한 정보들이 다 들어 있다
2. 실행 컨텍스트의 생성과정
1) 생성 단계 (Creation Phase)
- 변수, 함수 선언 등을 먼저 처리 (호이스팅 발생)
- 변수는 undefined로 초기화되고, 함수 선언은 메모리에 전체가 저장됨
- 스코프 체인 및 this, arguments 등 환경 정보 설정
2) 실행 단계 (Execution Phase)
- 실제 코드가 한 줄씩 실행되며 변수에 값이 할당되고, 함수가 호출됨
3. 실행 컨텍스트의 구성
실행 컨텍스트는 내부적으로 다음 세 가지 주요 구성 요소를 가짐 (위에꺼 복습)
Variable Environment |
Lexical Environment |
This Binding |
4. 실행 컨텍스트 스택 (콜 스택)
자바스크립트는 싱글 스레드
실행되는 모든 컨텍스트는 스택(Stack) 구조로 관리됨
- Global Execution Context (GEC): 프로그램이 시작되면 가장 먼저 생성되는 컨텍스트
- Function Execution Context (FEC): 함수가 호출될 때마다 새 컨텍스트가 쌓임
function foo() {
console.log("foo");
}
function bar() {
foo();
}
bar();
실행 순서:
- Global Context 생성 → bar() 호출
- bar() 컨텍스트 생성 → foo() 호출
- foo() 컨텍스트 생성
- foo() 실행 완료 → 컨텍스트 제거
- bar() 실행 완료 → 제거
- Global Context는 프로그램 종료 시 제거
5. 실행 컨텍스트와 this
this는 컨텍스트에 따라 참조 대상이 다름
전역 컨텍스트 | window 또는 global |
함수 내부 | 엄격 모드: undefined, 일반 모드: window |
객체 메서드 | 해당 객체 |
생성자 함수 | 새로 생성될 인스턴스 |
6. 실행 컨텍스트와 클로저의 관계
클로저: 외부 함수의 실행 컨텍스트가 사라진 이후에도, 내부 함수가 해당 컨텍스트의 변수에 접근할 수 있는 현상
function outer() {
let count = 0;
return function inner() {
count++;
console.log(count);
};
}
const fn = outer();
fn(); // 1
fn(); // 2
outer()의 컨텍스트는 사라졌지만 inner() 함수는 count에 접근할 수 있다.
=> Lexical Environment에 count의 정보가 유지되기 때문
마무리 정리
실행 컨텍스트 | 코드가 실행될 때 필요한 모든 환경 정보 |
생성 → 실행 | 컨텍스트는 2단계로 처리됨 |
콜 스택 | 실행 흐름은 스택 구조로 관리 |
클로저, this | 모두 실행 컨텍스트 구조로 설명 가능 |
실행컨텍스트 배울 때 클로저, 호이스팅, 스코프 체인, this 등 아주 많은 개념들이 나온다..