JavaScript - 실행 컨텍스트

Big Jay·2022년 8월 16일
0

JavaScript

목록 보기
6/8


실행 컨텍스트는 자바스크립트의 동작 원리의 핵심 개념이다.

자바스크립트 동작 순서

  1. 전역 객체 생성
  2. 전역 소스 코드 평가
    1-1 전역 실행 컨텍스트 생성
    1-2 전역 렉시컬 환경 생성
    • 전역 환경 레코드 생성
      • 객체 환경 레코드 생성
      • 선언적 환경 레코드 생성
    • this 바인딩
    • 외부렉시컬 환경에 대한 참조 결정
  3. 전역 코드 실행

실행 중 함수가 호출 될 경우

  1. 함수 코드 평가
  2. 함수 실행 컨텍스트 생성
  3. 함수 렉시컬 환경 생성
    • 함수 환경 레코드 생성
    • this 바인딩
    • 외부 렉시컬 환경에 대한 참조 결정
  4. 함수 코드 실행

동작에 대한 설명

0. 전역 객체 생성

전역 소스 코드 평가 이전에 생성되며 전역 객체에는 빌트인 전역 프로퍼티와 빌트인 전역 함수, 표준 빌트인이 추가된다.
참고: MDN

1. 전역 소스 코드 평가

소스코드가 로드되면 자바스크립트 엔진은 전역 소스 코드를 평가한다.

1) 전역 실행 컨텍스트 생성
빈 실행 컨텍스트를 생성하여 실행 컨텍스트 스택에 등록한다.

2) 전역 렉시컬 환경 생성
전역 렉시컬 환경이 생성한 후 전역 실행 컨텍스트에 연결한다.

렉시컬 환경은 2가지로 나뉜다.
환경레코드(Environment), 외부 렉시컬 환경에 대한 참조(Outer Lexical Environment Reference)

  • 전역 환경 레코드 생성
    전역 환경 레코드에는 객체 환경 레코드(Object Environment Record)와 선언적 환경 레코드로 구성되어 있다.
    • 환경 레코드
      • 객체 환경 레코드(Object Environment Record):
        Binding Object라고 부르는 객체와 연결되며 var, 함수 선언문이 등록된다. Binding Object는 전역 객체이다.
      • 선언적 환경 레코드(Declarative environment Record):
        let, const 선언한 전역 변수를 관리
        둘이 같이 전역 스코프와 전역 객체를 관리.
    • this 바인딩
      전역 환경 레코드의 [[globalThisValue]] 내부에 this가 바인딩 되며, 이 this에는 전역 객체(window)가 연결된다. 이것은 오로지 전역 환경 레코드와 함수 환경 레코드에만 존재한다.
    • 외부 렉시컬 환경에 대한 참조 결정
      현재 평가중인 소스코드를 포함하는 상위 스코프를 가리키며 이를 통해 단방향 링크드 리스트인 스코프 체인을 구현한다.

2. 전역 코드 실행

코드 평가가 끝나면 이제 코드를 실행한다. 이 때 변수에 값이 할당하거나 함수를 호출한다.

만약 전역 코드를 실행 중 함수 호출이 있다면 코드 실행을 중지하고 함수 내부 코드에 대한 평가를 시작한다.

3. 함수 코드 평가

1) 함수 실행 컨텍스트 생성
함수 실행 컨텍스트를 생성하고 실행 컨텍스트 스택 상단에 등록된다.

2) 함수 렉시컬 환경 생성
함수 렉시컬 환경을 생성 후 함수 실행 컨텍스트에 연결한다.

  • 함수 생성 레코드
    구성하는 컴포넌트 중 하나인 함수 환경 레코드는 매개변수, arguments 객체, 함수 내부에 선언한 지역 변수와 중첩 함수를 등록하고 관리한다.
  • this 바인딩
    함수 환경 레코드의 [[ThisValue]] 내부 슬롯에 this가 바인딩 되며 이는 함수 호출 방식에 따라 결정된다. (arrow 함수, 일반 함수) 일반함수 일대는 전역 객체를 가르킨다. 함수 내부에서 this를 사용하면 함수 환경 레코드의 바인딩 된 객체가 반환된다.
  • 외부 렉시컬 환경에 대한 참조 결정
    외부 렉시컬 환경에 대한 참조에는 함수 정의가 평가된 시점에 실행중인 실행 컨텍스트의 렉시컬 환경의 참조가 할당된다.

4. 함수 코드 실행

코드 평가가 끝나면 이제 코드를 실행한다. 이 때 변수에 값이 할당하거나 함수를 호출한다.

추가 설명

소스코드의 타입

소스코드는 4가지 타입으로 구분하며 각 타입의 소스코드는 실행 컨텍스트를 생성한다.

소스코드 타입설명
전역 코드전역에 존재하는 소스코드. 전역에 정의된 함수, 클래스 등의 내부 코드는 포함되지 않는다.
함수 코드함수 내부에 존재하는 소스코드. 함수 내부에 중첩된 함수, 클래스 등의 내부 코드는 포함되지 않는다.
eval 코드빌트인 전역 함수인 eval 함수에 인수로 전달되어 실행되는 소스코드.
모듈 코드모듈 내부에 존재하는 소스코드. 모듈 내부의 함수, 클래스 등의 내부 코드는 포함되지 않는다.

각 소스코드의 타입에 따라 코드가 평가되고 실행 컨텍스트가 생성된다.

실행 컨텍스트 스택

위 예제와 같이 전역코드와 함수 코드로 이루어져 있을 경우 실행 컨텍스트는 스택 자료구조로 관리되는데 이를 실행 컨텍스트 스택이라 한다.

  1. 전역 코드를 평가하고 실행 컨텍스트를 생성한 후 실행 컨텍스트 스택에 생성한다. LIFO(Last In First Out, 후입 선출)의 구조.
  2. 전역 함수 foo가 호출 되면서 전역 코드 실행이 중지 되고 foo 함수 내부로 이동하여 foo()에 대한 코드 평가와 실행 컨텍스트를 생성하고 이를 실행 컨텍스트 스택 위에 쌓고 코드를 실행하여 bar()를 호출한다.
  3. 함수 bar()가 호출 되면서 2번과 동일하게 실행되며 동일하게 실행 컨텍스트에 스택을 쌓은 후 코드 실행 후 더이상 실행할 코드가 없으면 스택에서 제거된다.
profile
안녕하세요.

0개의 댓글