[JavaScript] 실행 컨텍스트

olwooz·2022년 12월 20일
0

JavaScript

목록 보기
2/5

실행 컨텍스트 execution context

실행 컨텍스트란 JavaScript 코드가 실행되는 데 필요한 환경을 제공하고, 코드의 실행 결과를 관리하는 영역이다.
JavaScript 엔진이 코드를 실행할 때 실행 컨텍스트가 생성된다.

자바스크립트 Deep Dive 책에서는 JavaScript 엔진이 코드를 1. 평가 → 2. 실행 과정으로 나눠서 처리한다고 설명한다. 이 과정은 실행 컨텍스트생성 단계 creation phase실행 단계 execution phase를 말하는 것이다.

JavaScript 엔진이 코드를 처음 실행하면 글로벌 실행 컨텍스트를 생성해 다음의 두 단계를 거친다.

1. 생성 단계 creation phase

  • 글로벌 객체(브라우저 환경에선 window, Node.js 환경에선 global) 생성
  • this 객체 생성 후 글로벌 객체에 바인딩
  • 함수 선언과 undefined로 초기화된 변수 저장

2. 실행 단계 execution phase

  • 런타임이 시작되고 선언문을 제외한 코드를 순차적으로 한 줄씩 실행
  • 변수에 값 할당
  • 함수 호출

실행 단계에서 함수가 호출되면 함수 실행 컨텍스트가 생성된다.
함수 실행 컨텍스트글로벌 실행 컨텍스트와 같이 생성과 실행 단계를 거치지만,
글로벌 객체를 생성하는 대신 함수에 전달된 파라미터를 지역 변수처럼 사용할 수 있게 해주는
arguments 객체를 생성하고 this 바인딩을 결정한다.

실행 컨텍스트의 구조와 역할

실행 컨텍스트LexicalEnvironment (렉시컬 환경), VariableEnvironment, ThisBinding으로 구성된다.

실행 컨텍스트는 내부의 LexicalEnvironment 컴포넌트로 식별자와 스코프를 관리하고,
여러 실행 컨텍스트가 스택의 형태로 쌓여 코드 실행 순서를 제어한다 (i.e. 실행 컨텍스트 스택, 콜 스택).

LexicalEnvironment

LexicalEnvironment 내부에는 식별자 바인딩을 관리하는 저장소인 EnvironmentRecord 환경 레코드와 상위 스코프를 가리키는 OuterLexicalEnvironmentReference가 있다.
전역 EnvironmentRecordvar 키워드로 선언한 전역 변수와 let, const 키워드로 선언한 전역 변수를 구분하기 위해 Object Environment RecordDeclarative Environment Record로 나뉜다.

Object Environment Record - var 키워드로 선언한 전역 변수, 함수 선언문으로 정의한 전역 함수, 빌트인 전역 프로퍼티, 빌트인 전역 함수, 표준 빌트인 객체 관리

Declarative Environment Record - let, const 키워드로 선언한 전역 변수 관리

VariableEnvironment

VariableEnvironment는 처음 생성시 LexicalEnvironment와 동일한 값을 가지며 불변적이다.
LexicalEnvironment는 가변적이다. try...catch문에서 catch를 만나면 새로운 LexicalEnvironment가 생성된다. 이 때 변화된 LexicalEnvironment에서 기존 LexicalEnvironment의 식별자를 참조하기 위해 존재하는 것이 VariableEnvironment이다.

ThisBinding

실행 컨텍스트의 생성 단계에서 this에 바인딩한 객체를 가리킨다.

실행 컨텍스트 스택

새로운 실행 컨텍스트가 생성되면 실행 컨텍스트 스택push 되고, 실행이 끝나게 되면 pop된다.
맨 위에 위치한 실행 컨텍스트running execution context, 즉 현재 실행 중인 실행 컨텍스트이다.
코드 흐름에 따라 running execution context가 계속 변경되며 코드의 실행 순서가 관리된다.

세 줄 요약

  1. 실행 컨텍스트란 JavaScript 코드 실행에 필요한 요소들을 관리하는 영역이다.
  2. 실행 컨텍스트렉시컬 환경을 통해 식별자 바인딩과 상위 스코프 포인터를 저장한다.
  3. 실행 컨텍스트들은 스택의 형태로 쌓여 코드 실행 순서를 관리할 수 있게 해준다.

0개의 댓글