하루 30분 모던 자바스크립트 딥 다이브 실행 컨텍스트 2

실행 컨텍스트의 생성과 식별자 검색 과정

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

실행 컨텍스트와 블록 레벨 스코프

  1. let const는 모든 코드 블록을 지역 스코프로 인정하는 블록 레벨 스코프를 따른다.
  2. 코드 블록을 위한 블록 레벨 스코프를 생성해야 하므로, 선언적 환경 레코드를 갖는 렉시컬 환경을 새롭게 생성하여 기존의 렉시컬 환경을 교체한다.
  3. 만들어진 렉시컬 환경 객체의 외부 렉시컬 환경에 대한 참조는 블록을 가지고 있는 소스 코드의 렉시컬 환경을 가리킨다.