실행 컨텍스트의 생성과 식별자 검색 과정
- 전역 객체 생성
- 평가 이전에 생성되며, 빌트인 전역 프로퍼티, 빌트인 전역 함수, 표준 빌트인 객체가 추가되며 클라이언트 사이드 Web API또는 특정 환경을 위한 호스트 객체가 추가된다.
- 전역객체도 Object.prototype을 상속받는 프로토타입 체인의 일원이다.
- 전역 코드 평가
- 전역 실행 컨텍스트 생성
- 실행 컨텍스트에 푸시한다.
- 전역 렉시컬 환경 생성
- 전역 렉시컬 환경을 생성하고, 전역 실행 컨텍스트에 바인딩 한다.
- 렉시컬 환경은 환경 레코드와 외부 렉시컬 환경에 대한 참조로 구성된다.
- 객체 환경 레코드와 선언적 환경 레코드로 구성되어 있다.
- 객체 환경 레코드 생성
- 객체 환경 레코드는 var로 선언한 전역 번수, 함수 선언문으로 정의한 전역 함수, 빌트인 전역 프로퍼티, 빌트인 전역 함수, 표준 빌트인 객체를 관리.
- 객체 환경 레코드는 BindingObject를 통해 전역 객체의 프로퍼티와 메서드가 된다.
- 함수 선언문으로 정의한 함수는 객체 환경 레코드에 바인딩 된 BindingObject를 통해 전역 객체에 키로 등록하고 즉시 할당한다. 그래서 함수 선언 이전에 참조가 가능한 것이다. (함수 호이스팅과 변수 호이스팅의 차이)
- 선언적 환경 레코드 생성
- 선언적 환경 레코드에는 let과 const로 선언한 전역 변수를 관리
- let, const는 실행 흐름에 따라 TDZ에 빠지게 된다.
- this 바인딩
- 전역 환경 레코드의 [[GlobalThisValue]] 내부 슬롯에 this가 바인딩 된다.
- 객체 환경 레코드와 선언적 환경 레코드에서는 this 바인딩이 존재하지 않는다. 전역 환경 레코드와 함수 환경 레코드에만 존재한다.
- 외부 렉시컬 환경에 대한 참조
- 현재 평가 중인 소스코드를 포함하는 외부 소스코드의 렉시컬 환경, 즉 상위 스코프를 가리킨다.
- 전역 렉시컬 환경의 외부 렉시컬 환경에 대한 참조는 null을 가리킨다. 즉 스코프 체인의 종점을 말한다.
- 전역 실행 컨텍스트 생성
- 전역 코드 실행
- 문을 실행하면서 변수 또는 함수 이름이 선언되었는지 확인한다.
- 어느 스코프에서 참조하면 되는지 결정할 필요가 있는데, 이를 식별자 결정이라고 한다.
- 식별자 결정은 실행중인 실행 컨텍스트에서 검색하기 시작한다.
- 스코프 체인으로 검색할 수 없는 식별자는 참조 에러(Reference Error)를 발생시킨다.
- 함수 코드 평가
- 함수를 만나면 전역 코드의 실행을 일시 중단하고 함수 내부로 제어권이 이동한다
- 함수 실행 컨텍스트 생성
- 실행 컨텍스트를 생성. 함수 렉시컬 환경이 완성된 다음 푸시한다.
- 함수 렉시컬 환경
- 환경 레코드와 외부 렉시컬 환경에 대한 참조로 구성된다.
- 환경 레코드 생성
- 함수 환경 레코드는 매개변수, arguments 객체, 함수 내부의 지역 변수와 중첩 함수를 등록한다.
- this 바인딩
- 함수 환경 레코드의 [[ThisValue]] 내부 슬롯에 this가 바인딩 된다.
- this는 함수 호출 방식에 따라 결정된다.
- 외부 렉시컬 환경에 대한 참조
- 함수가 정의된 소스코드의 위치를 평가하여 할당된다.
- 자바 스크립트는 어디서 호출 했는지가 아닌 어디에 정의했는지에 따라 상위 스코프를 결정한다.
- 함수 객체의 [[Enviroment]] 내부 슬롯에 상위 스코프를 저장한다.
- 외부 렉시컬 환경에 대한 참조에 할당되는 것은 [[Enviroment]] 내부 슬롯에 저장된 상위 스코프이다.
- 함수 코드 실행
- 스코프 체인과 프로토타입 체인으로 식별자와 메서드를 검색하여 내부 코드를 실행한다.
- 스코프 체인은 현재 실행 중인 실행 컨텍스트의 렉시컬 환경에서 시작해 외부 렉시컬 환경에 대한 참조로 이어지는 렉시컬 환경의 연속이다.
- 함수 코드 종료
- 실행할 코드가 없으면 종료된다.
- 실행 컨텍스트 스택에서 함수가 pop되어 제거되고, 다음 실행 컨텍스트가 실행된다.
- 실행 컨텍스트 스택에서 제거되었다고 바로 소멸하는 것은 아니다. 렉시컬 환경은 독립적인 객체이므로, 참조되지 않을 때 비로소 가비지 컬렉터에 의해 메모리 공간 확보가 해제 되면서 소멸한다. 즉 누군가 참조하고 있다면 소멸하지 않는다.
- 전역 코드 실행 종료
실행 컨텍스트와 블록 레벨 스코프
- let const는 모든 코드 블록을 지역 스코프로 인정하는 블록 레벨 스코프를 따른다.
- 코드 블록을 위한 블록 레벨 스코프를 생성해야 하므로, 선언적 환경 레코드를 갖는 렉시컬 환경을 새롭게 생성하여 기존의 렉시컬 환경을 교체한다.
- 만들어진 렉시컬 환경 객체의 외부 렉시컬 환경에 대한 참조는 블록을 가지고 있는 소스 코드의 렉시컬 환경을 가리킨다.
'기술 서적 > 하루 30분 모딥다' 카테고리의 다른 글
[하루 30분 모던 자바스크립트 딥 다이브] 클로저의 캡슐화와 정보은닉 (0) | 2023.07.22 |
---|---|
[하루 30분 모던 자바스크립트 딥 다이브] 클로저란 무엇인가 (0) | 2023.07.21 |
하루 30분 모던 자바스크립트 딥 다이브 실행 컨텍스트 1 (0) | 2023.07.05 |
하루 30분 모던 자바스크립트 딥 다이브 this (0) | 2023.07.04 |
하루 30분 모던 자바스크립트 딥 다이브 빌트인 객체 (0) | 2023.06.29 |