March 07, 2022
실행 컨텍스트(Execution Context)는 자바스크립트 코드를 실행할 때 필요한 정보들을 저장하고 제공하는 환경입니다. 즉 스코프의 정보를 담은 환경을 의미합니다. 현재 실행되고 있는 컨텍스트에서 이 컨텍스트와 관련이 없는 코드가 실행된다면 새로운 컨텍스트가 생성되어 제어권을 가져갑니다. 그리고 이렇게 생성된 컨텍스트들은 실행 컨텍스트 스택 안에 쌓이게 됩니다. 각각의 컨텍스트는 실행이 종료된 이후 소멸되며, 소멸된 후 이전의 실행 컨텍스트에 제어권을 넘겨주게 됩니다. 전역 실행 컨텍스트까지 실행이 완료되면 모든 실행이 완료된 것으로 볼 수 있습니다.
console.log('global context')
function foo() {
console.log('foo context')
}
function bar() {
foo()
console.log('bar context')
}
bar()
// 출력 결과
// global context
// foo context
// bar context
1.가장 먼저 전역 코드가 실행되어 전역 실행 컨텍스트가 제어권을 가져갑니다. 그 결과 ‘global context’가 출력됩니다. 2.전역 실행 컨텍스트에서 bar() 함수가 호출되어 새로운 컨텍스트가 생성되어 스택에 쌓입니다. 그리고 이 컨텍스트가 제어권을 가져갑니다. 이 과정이 foo() 함수 호출 시에도 반복됩니다. 3.foo() 함수 안의 코드가 모두 실행되면 foo 실행 컨텍스트가 완료되어 소멸되며, 이후 bar 실행 컨텍스트도 완료되어 소멸됩니다. 최종적으로 전역 실행 컨텍스트까지 실행이 완료되어 모든 실행이 완료됩니다.
실행 컨텍스트는 Lexical Environment와 Variable Environment 두 가지 컴포넌트로 구성됩니다. 그리고 이 컴포넌트들은 Environment Records라 불리는 형태로 구성되어있습니다.
ECMAScript 명세에 나와 있는 실행 컨텍스트는 ES5와 ES2015의 실행 컨텍스트와 변경된 점이 있습니다.
ER은 렉시컬 스코프를 기반으로 특정 변수와 함수에 대한 식별자의 연결 정보를 저장합니다. 쉽게 말해 코드가 실행되면 변수나 함수에 대한 식별자를 선언하고, 코드가 한 줄 한 줄 실행될 때마다 선언된 식별자에 값을 할당할 수 있도록 바인딩하는 것입니다. 함수 선언, 블록문 또는 try, catch절과 같은 구문들이 평가될 때 식별자 바인딩을 위해 새로운 ER이 생성됩니다.
모든 ER에는 OuterEnv 필드가 있으며, 이 필드는 상위 렉시컬 스코프에 대한 ER을 참조합니다. 예를 들어 함수 안에 함수가 정의되어 중첩된 스코프를 가지는 경우 상위 함수 스코프에 대한 ER을 참조합니다. 최상위 실행 컨텍스트인 전역 컨텍스트에서는 참조할 상위 스코프가 없기 때문에 OuterEnv 필드는 null이 됩니다.
ER은 추상 클래스로서 이를 세부적으로 구현하는 declarative Environment Record, object Environment Record, global Environment Record 세 가지의 하위 ER이 있습니다. 그리고 declarative Environment Record의 하위에는 function Environment Record와 module Environment Record가 있습니다.