자바스크립트 엔진은 소스코드를 실행하기에 앞서 평가해, 실행에 필요한 정보를 수집한다.
실행 컨텍스트는 평가의 결과로 만들어지는 객체로, 스코프를 기준으로 각각의 실행 컨텍스트가 생성된다.
실행 컨텍스트는 식별자를 등록하고 관리하며, 스코프 체인을 형성하는 렉시컬 환경과
코드의 실행 순서를 결정하는 실행 컨텍스트 스택으로 구성된다.
전역 코드 또는 함수 코드가 각각의 실행 컨텍스트를 생성하면 생성된 순서대로 스택에 쌓이게(push) 된다.
스택에 쌓인 순서로 코드를 실행하는 중 새로운 실행 컨텍스트가 생성되어 스택에 쌓이면
코드 실행을 일시정지하고 스택 최상위의 실행 컨텍스트에 해당하는 코드를 먼저 실행한다.
해당 범위의 코드가 끝나면 실행 컨텍스트는 스택에서 제거되어(pop) 사라진다.
언제나 가장 마지막에 쌓인 실행 컨텍스트의 순서로 실행되기 때문에
스택 최상위의 실행 컨텍스트는 항상 현재 실행중인 실행 컨텍스트가 된다.
const a = 1; // 전역코드
function outerFunc () { // outerFunc함수 코드
const b = 2;
function innerFunc () { //innerFunc함수 코드
const c = 3;
console.log(a+b+c)
}
innerFunc();
}
outerFunc ();
전역 코드를 평가해 전역 실행 컨텍스트를 생성하고 스택에 쌓인다.
전역 코드를 실행 중, outerFunc함수가 호출되면 전역 코드의 실행은 잠깐 중단된다.
outerFunc함수 내부의 코드를 평가해 함수 컨텍스트가 생성되고 스택에 쌓인다.
outerFunc함수 실행 컨텍스트가 스택 최상위에 있기 때문에 해당 코드를 먼저 실행한다.
실행 중 innerFunc함수가 호출되면 다시 코드 실행을 중단한다.
같은 원리로 innerFunc함수 실행 컨텍스트가 스택에 쌓이고, 해당 코드를 먼저 실행한다.
console.log를 마지막으로 innerFunc함수는 종료된다.
innerFunc함수 실행 컨텍스트가 스택에서 제거된다.
outerFunc함수 코드의 중단됐던 지점으로 돌아가 남은 코드를 실행한다.
실행할 코드가 없기 때문에 outerFunc함수는 종료된다.
outerFunc함수 실행 컨텍스트가 스택에서 제거된다.
전역 코드의 중단됐던 지점으로 돌아가 남은 코드를 실행한다.
실행할 코드가 없기 때문에 스택에 남은 전역 실행 컨텍스트도 제거되고,
스택에는 실행할 컨텍스트가 남지 않는다.
렉시컬 환경은 실행 콘텍스트의 내용을 구성한다.
스코프에 포함된 식별자와 값을 관리하는 Environment Record(환경 레코드)와
해당 스코프의 상위 스코프인 Outer Lexical Environment Reference(외부 렉시컬 환경 참조)로 구성된다.