2-1 실행 컨텍스트란?
실행할 코드에 제공할 환경 정보들을 모아넣은 객체 ( JavaScript 가 왜 동적 언어인지 성격을 가장 잘 파악할 수 있는 개념 )
동일한 환경에 있는 코드들을 실행할 때 필요한 환경 정보들을 모아 컨텍스트를 구성하고, 이를 콜 스택(call stack) 에 쌓아올렸다가, 가장 위에 쌓여있는 컨텍스트와 관련 있는 코드들을 실행하는 식으로 전체 코드의 환경과 순서를 보장
동일한 환경 = 하나의 실행 컨텍스트를 구성할 수 있는 방법
전역 공간
eval() 함수
일반 함수
이 중 우리가 흔히 실행 컨텍스트를 구성하는 방법은 함수를 실행 하는 것
// 예제
// ------------------------------- (1)
var a = 1;
function outer() {
function inner() {
console.log(a); // undefined
var a = 3;
}
inner(); // ------------------- (2)
console.log(a); // 1
}
outer(); // --------------------- (3)
console.log(a); // 1;
(https://raw.githubusercontent.com/inu-appcenter/core-javascript-study/main/ch02/images/2-1-1.avif "그림-1")
실행 컨텍스트가 활성화될 때 자바스크립트 엔진은 해당 컨텍스트에 관련된 코드들을 실행하는 데 필요한 환경 정보들을 수집해서 실행 컨텍스트 객체에 저장
단, 이 객체는 자바스크립트 엔진이 활용할 목적으로 생성할 뿐 개발자가 코드를 통해 확인할 수는 없다.
- VariableEnviroment 현재 컨텍스트 내의 식별자들에 대한 정보 + 외부 환경 정보 선언 시점의 LexicalEnviroment 의 스냅샷으로, 변경 사항은 반영되지 않음.
- LexicalEnviroment ** 처음에는 VariableEnviroment 와 같지만 변경 사항이 실시간으로 반영됨.
- ThisBinding ** this 식별자가 바라봐야 할 대상 객체