23장 part3
1. 전역 실행 컨텍스트의 생성.
빈 전역 실행컨텍스트를 먼저 생성하고
실행 컨텍스트에 푸쉬함. // 처음 실행 컨텍스트는 빈 공간이므로 최상단에 전역 컨텍스트가 로드 됨.
2. 전역 렉시컬 환경의 생성
전역 렉시컬 환경을 생성하고 실행 컨텍스트에 바인딩.
// 지금 실행 컨텍스트의 최상단이 전역 컨텍스트
// 따라서 전역 컨텍스트에 바인딩 되는 것.
2.1 전역 환경 레코드 생성
전역변수를 관리하는 전역스코프와 전역객체 빌트인 프로퍼티, 전역함수 표준 빌트인을 담는 환경이라고
보면 될듯함.
객체 환경레코드는 var 키워드로 선언한 전역변수와 함수 선언문으로 정의한 함수,
빌트인 전역 프로퍼티, 빌트인 함수 등을 관리하는것,
선언적 환경레코드는 let, const 로 선언된 전역 변수를 관리함.
const 와 let 키워드로 선언하면 선언단계와 초기화 단계가 분리되어 실행되기 때문에
일시적으로 사각지대에 도달한다. 즉 선언에 도달 할 때까지 등록이 안되는 상태.
?? 그렇다면 const = () => 의 구조를 가지는 화살표 함수도 환경레코드에서 관리하는것이라고 봐야하는것일까?
2.2 this 바인딩
전역 환경 레코드의 [[globalthisvalue]]슬롯에 this가 바인딩.
전역 코드에서 this는 전역을 가르키므로 전역 환경 레코드에 전역객체가 바인딩되는 이유다.
2.3 외부 렉시컬 환경에 대한 참조 결정
정의가 평가된 시점에 실행컨텍스트의 렉시컬 환경에 참조가 할당된다.
foo() {
bar() {
}
}
에서 foo는 전역에 정의되어 있기 때문에 전역 평가가 일어날때
foo 에 대해 선언한다. 따라서 외부 참조는 전역 렉시컬이 할당되는것.

23.6.5 foo 함수 코드의 실행.
식별자 결정을 위해서 실행중인 컨텍스트의 렉시컬환경에서 식별자를 검색한다. 이때 없으면
외부 렉시컬 환경에서 이동하고 검색을 반복한다. 검색식별자에 값을 바인딩함.

23.6.6 bar 함수 평가.
위에서 foo의 함수평가와 같은 동작이 발생하는데 이때 bar의 선언은 foo에 있기 때문에
foo를 참조하고 등록하는 과정을 하게된다.
23.6.7 bar 함수의 실행
foo 의 동작과 동일한 과정이 반복되고
생성된 값을 console.log메서드에 전달한다.
23.6.8 bar의 종료
bar가 종료되었기 때문에 실행 컨텍스트에서 빠지게 되고 자연스레 남아있는 foo의 실행컨텍스트가
실행중인 컨텍스트로 변하게 된다.
23.6.9 foo 종료
foo 도 모든 과정을 마치고 실행컨텍스트에서 빠지게 되고 남은 전역컨텍스트로 실행컨텍스트가 변경되게 됨.
23.6.10 전역 코드의 종료
모든 코드가 종료되었기 때문에 실행 컨텍스트에서 전역 객체가 팝되고
실행 컨텍스트내부에 아무것도 남지 않게 된다.
23.7 실행 컨텍스트와 블록 레벨 스코프
실행 컨텍스트 내부에 블록을 만나게 되면,
렉시컬 스코프를 다시 변경해주는 과정이 발생하는데 이는 위에서 함수로 로직이 교체는것과
같은 맥락으로 동작한다.
이말은 독립적인 렉시컬 스코프를 만들어서 교체하고 끝나면 다시 원본으로 교체해주는것과 같은
구조인듯 하다.