모던 자바스크립트 Deep Dive - 23장

박상은·2021년 10월 3일
0

요약

1. 실행 컨텍스트

소스코드 평가과정에서 생성하는 것으로 소스코드를 실행하는 데 필요한 환경을 제공하는 영역
즉, 식별자를 등록하고 관리 스코프와 코드 실행 순서를 관리하는 객체다.

2. 렉시컬 환경

식별자와 식별자에 바인딩된 값, 상위 스코프에 대한 참조값을 기록하는 자료구조
즉, 식별자와 스코프를 관리함.

  • 식별자는 환경레코드( EnvironmentRecord )에 저장
  • 스코프는 외부 렉시컬 환경에 대한 참조( OuterLexicalEnvironmentReference )에 저장

3. 실행 컨텍스트 스택

코드의 실행 순서를 관리하는 스택
즉, 코드의 실행 순서대로 실행 컨텍스트 스택에 실행 컨텍스트를 넣음

4. 코드 평가

4.1 전역 코드 평가 순서

  1. 전역 객체 생성
  2. 전역 실행 컨텍스트 생성 후 실행 컨텍스트 스택에 푸시
  3. 전역 렉시컬 환경 생성 후 전역 실행 컨텍스트에 바인딩
    3-1. 객체 환경 레코드생성 후 BindingObject전역 객체 바인딩
    3-2. 선억적 환경 레코드생성 후 let or const를 이용해 선언한 전역 변수 등록
  4. this바인딩
  5. 외부 렉시컬 환경에 대한 참조 결정
  6. 전역 코드 실행

4.2 함수 코드 평가 순서

  1. 함수 실행 컨텍스트 생성 후 실행 컨텍스트 스택에 푸시 ( 제어권을 넘겨받음 )
  2. 함수 렉시컬 환경 생성 후 함수 실행 컨텍스트에 바인딩
    2-1. 함수 환경 레코드 생성 후 매개변수, arguments, 함수내부 지역변수들 등록
    2-2. this 바인딩 ( [[thisValue]]내부슬롯에 바인딩 )
    2-3. 외부 렉시컬 환경에 대한 참조 결정 ( [[Environment]]내부슬롯에 저장 )

5. 식별자 검색

식별자를 사용할 경우 현재 실행 중인 실행 컨텍스트의 렉시컬 환경에서 식별자를 검색한다.
만약 없을 경우 외부 렉시컬 환경에 대한 참조가 가리키는 렉시컬 환경으로 이동하여 검색하는 것을 반복한다.
전역 렉시컬 환경에서 찾지못한다면 외부 렉시컬 환경에 대한 참조가null값이라 undefined를 반환한다.

6. 실행 코드 종료

6.1 함수 실행 코드 종료

만약 함수의 실행 코드의 끝을 만나 종료를 하게된다면 현재 함수의 실행컨텍스트가 스택에서 제거되게 된다.
여기서 중요한점은 실행 컨텍스트 스택에서 제거되는 것이지 실행컨텍스트 자체가 제거되는 아니라는 것이다.

가비지컬렉터가 메모리할당을 해제하는 조건이 해당 값을 참조하는 값이 없을 때이다.
즉, 실행 컨텍스트에 정의되어있는 변수들을 만약 외부에서 사용하게 된다면 실행 컨텍스트를 제거하지 않는다는 것이고 이게 클로저의 원리다. ( 다음장에서 더 자세하게 다룸 )

6.2 전역 실행 코드 종료

실행 컨텍스트 스택에서 전역 실행 컨텍스트가 제거되고 아무것도 실행 컨텍스트에 남지 않게된다.
이 때 비동기 코드들이 실행된다. ( 이후에 자세하게 다룸 )

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

if문 같은 블록에 let or const로 변수를 선언하게 되면 블록 렉시컬 환경을 생성하고 현재 실행 컨텍스트가 생성한 블록 렉시컬 환경에 대한 참조값을 가지게 된다.

기존 참조값은 블록 렉시컬 환경외부 렉시컬 환경에 들어간다.
따라서 블록 레벨 스코프를 사용할 수 있는 것이다.

마무리

  • 자바스크립트 엔진은 코드평가단계와 코드실행단계로 나눠서 코드를 실행한다.

0개의 댓글