본문 바로가기

Today I Learned

모던 자바스크립트 Deep Dive 23장 실행 컨텍스트

🔑  키워드 정리

  • 실행 컨텍스트 : 자바스크립트의 동작 원리를 담은 핵심 개념. 소스코드를 실행하는 데 필요한 환경을 제공하고 코드의 실행 결과를 실제로 관리하는 영역이다. 달리 말하면, 식별자를 등록하고 관리하는 스코프와 코드 실행 순서를 구현한 내부 매커니즘을 말한다.
  • 렉시컬 환경 : 식별자와 식별장에 바인딩된 , 그리고 상위 스코프에 대한 참조를 기록하는 자료구조이다. 실행 컨텍스트를 구성하고 있다.
  • 소스코드의 종류 : 전역 코드, 함수 코드, eval 코드, 모듈 코드
  • 환경 레코드 : 식별자를 등록하고 식별자에 바인딩된 값을 관리하는 저장소
  • 외부 렉시컬 환경에 대한 참조 : 상위 스코프. 해당 실행 컨텍스트를 생성한 소스코드를 포함하는 상위 코드의 렉시컬 환경

📗 내용 정리

모든 소스코드는 평가되고 실행하는 2가지의 단계를 거친다.
전역 코드 평가 ➡️ 전역 코드 실행 ➡️ 함수 코드 평가 ➡️ 함수 코드 실행

실행 컨텍스트는 스택 자료구조로 관리된다. 이를 실행 컨텍스트 스택이라고 한다.

실행 컨텍스트 스택은 코드의 실행 순서를 관리하고, 렉시컬 환경은 스코프와 식별자를 관리한다.

전역 코드 평가 과정

전역 실행 컨텍스트 생성 ➡️ 전역 렉시컬 환경 생성 ➡️ 전역 환경 레코드 생성 ➡️ 객체 환경 레코드 생성(*1) 
➡️ 선언적 환경 레코드 생성(*2) ➡️ this 바인딩 ➡️ 외부 렉시컬 환경에 대한 참조 결정(*3)

(*1) 객체 환경 레코드 생성에서 BingdingObject 통해서 var 키워드로 선언한 전역 변수와 함수 선언문으로 정의된 전역 함수를 전역 객체의 프로퍼티와 메서드로 만든다.  (*함수 선언문은 전역 객체에 키를 등록할 함수 객체를 즉시 할당한다. 그러므로, 함수 선언문 이전에 호출할 있다.)

(*2) let, const 킹워드로 선언한 전역 변수를 등록하고 관리한다.

(*3) 전역 렉시컬 환경의 외부 렉시컬 환경에 대한 참조는 없다. null 할당되어 있다.

함수 코드 평가 과정

함수 실행 컨텍스트 생성 ➡️ 함수 렉시컬 환경 생성 ➡️ 함수 환경 레코드 생성
➡️ this 바인딩 ➡️ 외부 렉시컬 환경에 대한 참조 결정

렉시컬 환경은 실행 컨텍스트와는 독립된 객체다. 실행 컨텍스트에서 foo 함수 실행 컨텍스트가 제거될 foo 함수 렉시컬 환경이 즉시 소멸되지는 않는다. 객체와 변수가 모두 참조되지 않을 때 가비지 컬렉터가 동작하고 메모리 공간이 확보된다.