실행할 코드에 제공할 **환경 정보**들을 모아놓은 객체이다.
자바스크립트는 실행 컨텍스트가 활성화되는 시점에
1. 호이스팅이 발생한다.
2. 외부 환경 정보를 구성한다.
3. this 값을 설정한다.
함수 실행, eval 함수 실행, block 을 만들면 call stack 에 실행 컨텍스트가 쌓인다.
전역은 자동으로 컨텍스트로 구성된다 :)
이 말은 즉슨 우리가 흔히 실행 컨텍스트를 구성하는 방법은 함수를 실행 하는 것이란 말이된다.
그렇다면.. 실행 컨텍스트를 구성할때 생기는 것들은?
1. VariableEnvironment
컨텍스트 내의 변수들에 대한 정보
외부 환경 정보
선언 시점의 스냅샷 유지를 목적으로 사용
2. LexicalEnvironment
처음에는 VariableEnvironment을 그대로 복사한 것
변경 사항은 이곳에 반영된다.
3. ThisBinding
식별자가 바라봐야 할 대상 객체
LexicalEnvironment 는 environmentRecord 와 outerEnvironmentReference 로 구성된다.
environmentRecord 로 인해서 호이스팅이 발생한다.
outerEnvironmentReference 로 인해서 스코프와 스코프 체인이 형성된다.
environmentRecord 에는 현재 컨텍스트와 관련된 코드의 식벽자 정보들이 저장된다.
매개변수 이름... 함수선언... 변수명...
컨텍스트 내부 전체를 처음부터 훑으면서 순서대로 수집! 수집이 끝나도 아직 코드는 실행 되기
전이다. 그렇다!
JS 엔진은 이미 이 시점에 해당 환경에 속한 변수 명들을 다 알고 있는 것이다.
여기서 호이스팅이란 개념이 나온다. 이러한 일련의 과정을 쉽게 이해하기 위한 방법으로
추상화한 개념이 호이스팅이다.
스코프와 스코프 체인
스코프 체인은 유효범위를 안에서부터 바깥으로 찾아나가는 것을 말한다. 그리고 이것을 가능하게
하는 것이 outerEnvironmentReference 이다.
outerEnvironmentReference 는 현재 호출된 함수가 선언될 당시의 LexicalEnvironment를
참조한다.