ECMAScript 사양은 소스크드를 4가지 타입으로 구분한다. 전역코드, 함수코드. eval코드, 모듈코드. 모든 소스코드는 실행에 앞서 평가 과정을 거친다. 즉, '소스코드의 평가' 와 '소스코드의 실행' 과정으로 나누어 처리한다. 소스코드 평가 과정을 실행 컨텍스트가 관리하는 스코프에 등록하고, 이 과정이 끝나면 소스코드가 순차적으로 실행된다. 이 결과는 다시 실행 컨텍스트가 관리하는 스코프에 등록된다.
실행 컨텍스트는 스택자료구조로 관리 된다. 이를 실행 컨텍스트 스택(콜 스택)이라고 부른다.
// 전역 코드를 평가와 실행한다. 여기서는 전역 변수 x와 전역 함수 foo를 전역 실행 컨텍스트에 등록한다.
const x = 1;
// 전역 함수 foo가 호출 되면 전역 코드의 실행은 일시 중단된다. foo 함수 실행 컨텍스트를 생성하고 실행 컨텍스트 스택에 푸시한다.
// 이때 foo 함수에 지역변수 y 와 중첩함수 bar 가 foo 함수 실행 컨텍스트에 등록된다. y 에 값이 할당되고, 함수 bar를 호출한다.
function foo () {
const y = 2;
// 마찬가지로 foo 함수의 실행은 중단되고, bar 함수 실행 컨텍스트를 생성하고 실행 컨텍스트 스택에 푸시한다.
// 지역변수 z에 값을 할당하고, console.log 메서드를 호출한뒤 종료된다.
function bar (){
const z = 3;
console.log(x + y+ z);
}
// bar 함수 종료 이후 다시 코드 제어권이 foo 함수로 이동. bar 함수 실행 컨텍스트를 실행 컨텍스트 스택에서 제거한다.
bar();
}
// foo 함수 종료 이후 다시 전역 코드로 이동. foo 함수 실행 컨텍스트를 실행 컨텍스트에서 제거.
// 이후 실행할 전역 코드가 남아 있지 않으므로 전역 실행 컨텍스트도 실행 컨텍스트에서 제거.
foo();//6
// 실행 컨텍스트 스택은 코드의 실행 순서를 관리한다.