실행 컨텍스트란 실행 코드에 제공할 정보들을 모아 놓은 객체이며, 실행되는 환경의 추상적인 개념입니다. JavaScript 코드가 실행될 때마다 실행 컨텍스트 내에서 실행된다.
JavaScript에는 3가지 유형의 실행 컨텍스트가 있다.
자바스크립트 엔진이 Heap, Call Stack 나눠지게 되는데 실행 컨텍스트는 CallStack이라는 곳에 쌓이게 되며 모든 실행 컨텍스트를 저장하는 데 사용되는 실행 스택은 LIFO(후입선출)구조이다. 아래의 예제코드로 이해 해보도록 한다.
// ------------------------ (1)
var a = 1;
function outer() {
function inner() {
console.log(a);
var a = 3;
// ------------------ (2)
}
inner(); // ------------ (3)
console.log(a);
// --------------------- (4)
}
outer(); // --------------- (5)
console.log(a);
// ------------------------ (6)
위의 코드가 브라우저에 로드되면 Javascript 엔진은 전역 컨텍스트를 생성하고 현재 실행 스택에 PUSH 한다.
inner 함수 까지 쌓은 실행 컨텍스트의 정보는 inner 함수 실행 후 종료 시 스택에서 제거해 나갑니다. 그 다음은 outer 함수를 스택에서 제거하고 모든 코드가 실행되면 JavaScript 엔진은 현재 스택에서 전역 컨텍스트를 제거한다.
실행 컨텍스트는 3가지 정보를 가지고 있다.
Variable Environment 와 Lexical Environment 의 내부에는 envrionmentRecord 와 outerEnvironmentReference 의 객체를 가지고 있다는 부분에서 동일하지만 Variable Environment 는 최초의 스냅샷의 개념으로 변경되는 컨텍스트 정보에 대해 업데이트를 하지 않는다.
여기서 각 실행 컨텍스트를 구성하는 범위 Scope를 연결하여 현재 Scope에서 선언되지 않는 변수를 호출 한다면 상위에서 찾을 수 있도록 outerEnvironmentReference 가 스코프체인을 구성할 수 있도록 주소를 참조하게 된다. environmentRecord 의 경우 해당 컨텍스트에서 선언된 변수 식별자 정보들이 저장되어 있다.
thisBinding 은 현재 이 컨텍스트가 어떤 this 를 바인딩하고 있는지 정보를 가지고 있는데 기본적으로 this 를 명시하지 않으면 전역객체를 바라보게 되어있다.
https://medium.com/crocusenergy/js-%EC%8B%A4%ED%96%89-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8-2b8ab8da4f4
https://blog.bitsrc.io/understanding-execution-context-and-execution-stack-in-javascript-1c9ea8642dd0
https://blog.naver.com/dlaxodud2388/222238394694
https://dh2note.tistory.com/104
https://joontae-kim.github.io/2020/10/15/excution-context-2/