23장 실행 컨텍스트
23.1 소스코드의 타입
- 4가지 타입의 소스코드(실행 가능한 코드, executable code)는 실행 컨텍스트를 생성한다.
- 소스코드의 타입에 따라 실행 컨텍스트를 생성하는 과정과 관리 내용이 다르다.
1. 전역 코드(global code)
: 전역에 존재하는 소스코드,
- 전역에 정의된 함수, 클래스 등의 내부 코드는 포함되지 않는다.
- 전역 변수를 관리하기 위해 최상위 스코프인 전역 스코프를 생성해야 한다.
- 전역 코드가 평가되면 전역 실행 컨텍스트가 생성된다.
2. 함수 코드(function code)
: 함수 내부에 존재하는 소스코드,
- 함수 내부에 중첩된 함수, 클래스 등의 내부 코드는 포함되지 않는다.
- 지역 스코프를 생성하고 지역 변수, 매개변수, arguments 객체를 관리한다.
3. eval 코드
: 빌트인 전역 함수인 eval 함수에 인수로 전달되어 실행되는 소스코드
- strict mode 에서 자신만의 독자적인 스코프를 생성한다.
4. 모듈 코드(module code)
: 모듈 내부에 존재하는 소스코드,
- 모듈 내부의 함수, 클래스 등의 내부 코드는 포함되지 않는다.
- 모듈별로 독립적인 모듈 스코프를 생성한다.
23.2 소스코드의 평가와 실행
스소코드 평가 과정
: 실행 컨텍스트를 생성하고 변수, 함수 등의 선언문만 먼저 실행하여 생성된 변수나 식별자를 키로 실행 컨텍스트가 관리하는 스코프에 등록한다.
소스코드의 실행
:
23.3 실행 컨텍스트의 역할
// 전역 변수 선언
const x = 1;
const y = 2;
// 함수 정의
function foo(a) {
// 지역 변수 선언
const x = 10;
const y = 20;
// 메서드 호출
console.log(a + x + y); // 130
}
// 함수 호출
foo(100);
// 메서드 호출
console.log(x + y);
- 전역 코드 평가
전역 변수와 전역 함수가 실행 컨텍스트가 관ㄹ하는 전역 스코프에 등록된다.
- 전역 코드 실행
전역 코드를 순차적으로 실행
전역 변수에 값이 할당되고 함수가 호출된다.
- 함수 코드 평가
매개변수와 지역 변수 선언문이 먼저 실행되고, 그 결과 생성된 매개변수와 지역 변수가 실행 컨텍스트가 관리하는 지역 스코프에 등록된다.
- 함수 코드 실행
매개변수와 지역 변수에 값이 할당되고 console.log 메서드가 호출된다.
코드가 실행되려면 다음과 같이 스코프, 식별자, 코드 실행 순서 등의 관리가 필요하다.
실행 컨텍스트: 소스코드를 실행하는 데 필요한 환경을 제공하고 코드의 실행 결과를 실제로 관리하는 영역
식별자(변수, 함수, 클래스 등의 이름) 를 등록하고 관리하는 스코프와 코드 실행 순서 관리를 구현한 내부 메커니즘으로, 모든 코드는 실행 컨텍스트를 통해 실행되고 관리된다.
23.4 실행 컨텍스트 스택
const x = 1; // 전역 변수
function foo () { // 전역 함수
const y = 2; // 지역 변수
function bar () { // 중첩 함수
const z = 3; // bar 함수의 지역 변수
console.log(x+y+z);
}
bar();
}
foo();
- 전역 코드의 평가와 실행
전역 코드를 평가하여 전역 실행 컨텍스트를 생성하고 실행 컨텍스트 스택에 푸시한다.
- foo 함수 코드 평가와 실행
전역 코드 실행 중지 , 코드의 제어권이 foo 함수 내부로 이동함
foo 함수 실행 컨텍스트를 생성하여 해당 스택에 푸시 -> foo 함수의 지역 변수 y와 중첩 함수 bar 가 foo 실행 컨텍스트에 등록됨
-> 지역 변구 y에 값 할당, 중첩 함수 bar 호출
- foo 함수 실행 중단 -> 중첩 함수 bar 호출 -> bar 함수 실행 컨텍스트 생성, 스택에 푸시 -> 지역 변수 z 등록 -> z에 값 할당, console.log 호출 -> bar 종료
- 코드 제어권이 다시 foo 함수로 이동
- foo 함수 종료 후 다시 전역 코드로 이동
렉시컬 환경 : 식별자와 식별자에 바인딩된 값, 그리고 상위 스코프에 대한 참조를 기록하는 자료 구조로 실행 컨텍스트를 구설하는 컴포넌트
아주 유용한 정보네요!