자바스크립트 실행 컨텍스트 - 3
2022/10/29
n°22
category : JavaScript
☼
2022/10/29
n°22
category : JavaScript
실행 컨텍스트는 스택 자료구조로 관리된다
:이를 실행 컨텍스트 스택이라고 한다.
const x = 1;
function foo () {
const y = 2;
function bar() {
const z = 3;
console.log(x + y + z);
}
bar();
}
foo(); // 6 출력
실행 컨텍스트 순서 :
1 전역 코드의 평가와 실행
자바스크립트 엔진은 전역 코드를 평가하여 실행 컨텍스트를 생성하고, 실행 컨텍스트 스택에 푸시한다. 이후 전역 코드가 실행되기 시작하여 변수 x에 값이 할당되고 함수 foo를 호출한다.
2 foo 함수 코드의 평가와 실행
전역 함수 foo가 호출되면 전역 코드의 실행은 일시 중단되고, 코드의 제어권이 foo 함수 내부로 이동한다. 자바스크립트 엔진은 foo 함수 코드를 평가하여 실행 컨텍스트를 생성하고, 실행 컨텍스트 스택에 푸시한다. 이후 foo 함수 코드가 실행되면서 중첩 함수 bar가 호출된다.
3 bar 함수 코드의 평가와 실행
중첩 함수 bar가 호출되면 foo 함수 코드의 실행은 일시 중단되고 코드의 제어권이 bar함수 내부로 이동한다. 또다시 마찬가지로 bar 함수 코드를 평가하여 실행 컨텍스트를 생성, 실행 컨텍스트 스택에 푸시한다. 이 때 bar 함수의 지역 변수 z가 bar 함수 실행 컨텍스트에 등록된다. 이후 bar 함수 코드가 실행되기 시작하여 지역변수 z에 값이 할당되고, console.log 메서드를 호출한 뒤, bar 함수는 종료된다.
4 foo 함수로 복귀
bar 함수가 종료되면 제어권은 다시 foo 함수로 이동한다. 이때 bar 함수 실행 컨텍스트를 실행 컨텍스트에서 팝하여 제거한다. 이후 foo 함수는 더 이상 실행할 코드가 없으므로 종료된다.
5 전역 함수로 복귀
foo 함수가 종료되면 코드 제어권은 다시 전역 코드로 이동한다. 이때 자바스크립트 엔진은 실행 컨텍스트 스택에서 foo 함수를 팝하여 제거한다. 이후 전역 코드에도 아무것도 실행할 것이 남지 않아 전역 실행 컨텍스트도 팝되어 실행 컨텍스트 스택에는 아무것도 남아있지 않게 된다. 이처럼 실행 컨텍스트 스택은 코드의 실행 순서를 관리한다.
요약
💡 렉시컬 환경은 스코프와 식별자를 관리한다
: 실행 컨텍스트 스택 → 코드의 실행 순서 관리
: 렉시컬 환경이란? 함수가 정의된 곳에서 상위 스코프를 결정한다 (정적 스코프)
const x = 1;
function foo () {
const y = 2;
console.log(x + y);
}
렉시컬 환경은 키와 값을 갖는 객체 형태의 스코프(전역, 함수, 블록 스코프)를 생성하여 식별자를 키로 등록하고 식별자에 바인딩된 값을 관리한다. 즉, 렉시컬 환경은 스코프를 구분하여 식별자를 등록하고 관리하는 저장소 역할을 하는 렉시컬 스코프의 실체다.
실행 컨텍스트는 LexicalEnvironment 컴포넌트와 VariableEnvironment 컴포넌트로 구성된다.
렉시컬 환경은 다시 EnvironmentRecord와 OuterLexicalEnvironmentReference 두 컴포넌트로 구성된다.