본 내용은 모던 자바스크립트 Deep Dive - 자바스크립트의 기본 개념과 동작 원리를 토대로 작성하였습니다.
23.6 실행 컨텍스트의 생성과 식별자 검색 과정
23.6.1 전역 객체 생성
- 전역 코드 평가 이전에 전역 객체가 생성
- 빌트인 전역 프로퍼티
- 빌트인 전역 함수
- 표준 빌트인 객체
- 동작 환경에 따라
- 클라이언트 사이드 Web API(DOM, BOM, Canvas ..)
- 특정 환경을 위한 호스트 객체
- 전역 객체 또한 Object.prototype을 상속 받음
23.6.2 전역 코드 평가
1. 전역 실행 컨텍스트 생성
- 비어있는 전역 실행 컨텍스트를 생성
- 실행 컨텍스트 스택에 푸시
- 이 시점에서 전역 실행 컨텍스트는 컨텍스트의 최상위
- 즉, 실행 중인 실행 컨텍스트
2. 전역 렉시컬 환경 생성
- 전역 렉시컬 환경을 생성하고 전역 실행 컨텍스트에 바인딩
- 렉시컬 환경은 2개의 컴포넌트로 구성
- 환경 레코드
- 외부 렉시컬 환경에 대한 참조
2-1. 전역 환경 레코드 생성
- 아래를 제공
- 전역 변수를 관리하는 전역 스코프
- 전역 객체의 빌트인 전역 프로퍼티
- 빌트인 전역 함수
- 표준 빌트인 객체
- ES6 이전에는 전역 객체가 이 역할을 수행
- let, const 키워드로 선언한 전역 변수는 개념적인 블록 내에 존재
- var와 ES6 이후의 let, const로 선언된 변수를를 구분하기 위해서 전역 환경 레코드는 객체 환경 레코드, 선언적 환경 레코드로 구성
- 객체 환경 레코드
- 기존 전역 객체가 관리하던 var 키워드로 선언한 전역 변수, 함수 선언문으로 정의한 전역 함수, 빌트인 전역 프로퍼티, 빌트인 전역 함수, 표준 빌트인 객체를 관리
- BindingObject라고 부르는 객체와 연결(전역 객체 생성 때 생성된 전역 객체)
- 전역 코드 평가 과정에서 var 키워드의 변수는 BindingObject를 통해 전역 객체의 프로퍼티가 됨
- window 식별자 없이 전역 객체의 프로퍼티를 참조할 수 있음
- var이므로 호이스팅이 발생하며 선언과 초기화가 동시에 발생
- 함수 선언문의 경우 생성된 함수 객체를 즉시 할당하므로 함수 선언문 이전의 시점에서 호출할 수 있음
- 선언적 환경 레코드
- let, cosnt 키워드로 선언한 전역 변수를 관리
- let,const 키워드로 선언한 변수가 관리되는 개념적인 블록
- 초기화 단계가 분리되어, let,const 변수가 초기화 되기 전에 접근하면 일지적 사각지대에 빠짐
- 두 레코드는 서로 협력하여 전역 스코프, 전역 객체를 관리
2.2 this 바인딩
- 전역 환경 레코드의 [[GlobalThisValue]] 내부 슬롯에 this가 바인딩
- 전역 코드에서 this는 전역 객체이므로 전역 객체가 바인딩
- 객체 환경 레코드와 선언적 환경 레코드에는 this 바인딩이 없음
2.3 외부 렉시컬 환경에 대한 참조 설정
- 현재 평가 중인 소스코드를 포함하는 외부 소스코드의 렉시컬 환경(상위 스코프)을 가리킴
- 단방향 링크드 리스트인 스코프 체인 구성
- 전역 코드의 경우 null이 할당
- 전역 렉시컬 환경이 스코프 체인의 종점에 존재함을 의미
23.6.3 전역 코드 실행
- 전역 코드의 순차적 실행
- 변수 할당문이 실행되어 값이 할당
- 함수를 마주치면 함수를 실행
- 식별자 결정(Identifier Resolution)
- 식별자가 선언이 되었는지
- 어느 스코프의 식별자를 참조하면 되는지
- 실행 컨텍스트에서 식별자를 검색
- 선언된 식별자는 실행 컨텍스트의 렉시컬 환경의 환경 레코드에 등록되어 있음
- 환경 레코드에 없는 경우 외부 렉시컬 환경에 대한 참조가 가리키는 렉시컬 환경으로 이동(상위 스코프)하여 식별자 검색
- 모든 스코프 체인을 올라갔어도 없는 경우에는 Reference Error 발생
23.6.4 함수 코드 평가
- 함수가 호출되면 전역 코드의 실행을 일시 중단
- 함수 내부로 코드 제어권 이동
- 이어서 함수 코드 평가 시작
1. 함수 실행 컨텍스트 생성
- 생성된 함수 실행 컨텍스트는 함수 렉시컬 환경이 완성된 다음 실행 컨텍스트 스택에 푸시
- 이 시점에서, 함수 실행 컨텍스트가 실행 컨텍스트 스택의 최상위인 실행 중인 실행 컨텍스트임
2. 함수 렉시컬 환경 생성
- 함수 렉시컬 환경을 생성하고 함수 실행 컨텍스트에 바인딩
2.1 함수 환경 레코드 생성
- 매개변수, arguments 객체, 함수 내부에서 선언한 지역 변수와 중첩 함수를 등록하고 관리
2.2 this 바인딩
- 함수 환경 레코드의 [[ThisValue]] 내부 슬롯에 this가 바인딩
- 바인딩될 객체는 함수 호출 방식에 따라 결정
2.3 외부 렉시컬 환경에 대한 참조 설정
- 상위 렉시컬 환경의 참조가 할당 됨
- 자바 스크립트는 함수를 어디엣 정의했는지에 따라 상위 스코프를 결정
- 자바 스크립트 엔진은 함수 정의를 평가하여 함수 객체 생성시 함수 객체의 내부 슬롯 [[Enviroment]]에 함수 상위 스코프를 저장
- 이 내부 슬롯이 외부 렉시컬 환경에 대한 참조에 할당
'programming study > JavaScript' 카테고리의 다른 글
24장 클로저(2) (0) | 2022.04.01 |
---|---|
24장 클로저(1) (0) | 2022.03.29 |
23장 실행 컨텍스트(4) (0) | 2022.03.26 |
23장 실행 컨텍스트(3) (0) | 2022.03.25 |
23장 실행 컨텍스트(2) (0) | 2022.03.24 |