JavaScript

[DeepDive] - 23장(실행 컨텍스트) 필요 내용 정리

실행 컨텍스트

소스 코드의 4가지 타입

  • 소스 코드를 4가지로 구분하는 이유: 소스 코드 타입에 따라 실행 컨텍스트를 생성하는 과정과 관리가 다르기 때문이다.
    1. 전역 코드: 전역에 존재하는 소스코드, 전역에 정의된 함수, 클래스 등의 내부 코드는 포함 X, 전역 실행 컨텍스트 생성
    2. 함수 코드: 함수 내부에 존재하는 소스코드, 함수 내부에 중첩된 함수, 클래스 등의 내부 코드 포함 X, 함수 실행 컨텍스트 생성
    3. eval 코드: 빌트인 전역 함수인 eval 함수에 인수로 전달되어 실행되는 소스코드, eval 실행 컨텍스트 생성
    4. 모듈 코드: 모듈 내부에 존재하는 소스코드, 모듈 내부의 함수, 클래스 등의 내부 코드는 포함 X, 모듈 실행 컨텍스트 생성

 

소스 코드의 평가, 실행

  • JS 엔진은 평가와 실행 단계를 거쳐 소스코드 처리
    • 소스 코드 평가: 실행 컨텍스트 생성, 변수와 함수 등의 선언문 선실행, 생성된 변수 혹은 함수 식별자를 키로 실행 컨텍스트가 관리하는 스코프에 등록 (런타임 이전)
    • 소스 코드 실행: 선언문을 제외한 소스코드 순차적 실행(런타임), 소스 코드 실행에 필요한 변수나 함수의 참조를 실행 컨텍스트가 관리하는 스코프에서 검색하여 취득

실행 컨텍스트

  • 소스 코드를 실행하는 데 필요한 환경 제공, 실행 결과 관리
  • 식별자(변수명, 함수명, 클래스명)을 등록하고 관리하는 스코프와 코드 실행 순서 관리를 구현한 내부 메커니즘
  • 모든 코드는 실행 컨텍스트를 통해 실행 및 관리
  • JS에서 실행 컨택스트는 스택 형태로 관리, 코드의 실행 순서 관리
  • 현재 실행중인 코드의 실행 컨텍스트는 실행 컨텍스트 스택 최상위에 존재하는 실행 컨텍스트

 

렉시컬 환경

  • 식별자와 식별자에 바인딩된 값, 상위 스코프에 대한 참조를 기록하는 자료구조
  • 실행 컨텍스트가 코드의 실행 순서를 관리한다면 렉시컬 환경은 스코프와 식별자 관리
  • 환경 레코드(Environment Record), 외부 렉시컬 환경 참조(Outer Lexical Environment Record)
    • 환경 레코드: 스코프에 포함된 식별자 등록, 등록된 식별자에 바인딩된 값을 관리하는 저장소
    • 외부 렉시컬 환경 참조: 상위 스코프 참조, 이때 상위 스코프는 외부 렉시컬 환경, 즉 해당 실행 컨텍스트를 생성한 소스 코드를 포함하는 상위 코드의 렉시컬 환경을 가리킨다.(단방향 링크드 리스트인 스코프 체인)
    • 전역 렉시컬 환경의 외부 렉시컬 환경 참조의 경우 null이 할당

전역 렉시컬 환경

  • 전역 렉시컬 환경의 환경 레코드는 객체 환경 레코드선언적 환경 레코드 로 구분
    • 객체 환경 레코드: var 키워드 전역 변수, 함수 선언문으로 정의한 전역 함수, 빌트인 전역 프로퍼티와 빌트인 전역 함수, 표준 빌트인 객체 관리
    • 선언적 환경 레코드: let, const 키워드 전역 변수 관리