본문 바로가기

JavaScript

JavaScript Execution Context - 1

1. 실행 컨텍스트(Execution Context)

실행 컨텍스트란 실행이 가능한 코드들이 펼가 또는 실행되고 관리되는 영역입니다.

 

JavaScript의 실행 컨텍스트는 크게 세 가지 종류가 있습니다.

 

(1) 전역 실행 컨텍스트 (Global Execution Context, GEC)

JavaScript 코드가 실행을 시작하는 기본 실행 컨텍스트입니다.

모든 전역 코드가 전역 실행 컨텍스트 내에서 실행됩니다.

JavaScript의 엔진은 싱글쓰레드이므로 하나의 전역 환경만 가능합니다. 이는 GEC는 둘 이상일 수 없다는 뜻과 같습니다.

 

(2) 함수 실행 컨텍스트 (Function Execution Context, FEC)

함수를 호출할 때마다 생성하는 실행 컨텍스트입니다.

함수는 각자 자신의 고유한 실행 컨텍스트를 가지고 있습니다. 전역 컨텍스트와는 달리 함수가 호출될 때마다 ㅅㅇ성하므로 하나 이상일 수 있습니다.

전역 컨텍스트에 접근할 수 있습니다.

 

(3) eval

eval 함수 내에서의 실행 컨텍스트입니다.

eval 함수란 문자열로 JavaScript 코드를 실행시키는 함수입니다.

※ 보안상 위험하므로 실행 컨텍스트를 생성한다는 것만 알고 사용하지는 마세요!

 

eval() - JavaScript | MDN

eval()은 문자로 표현된 JavaScript 코드를 실행하는 함수입니다.

developer.mozilla.org

 

2. Call Stack

JavaScript는 실행 컨텍스트의 실행을 관리하기 위해 Call Stack이라는 구조를 사용하며, 이름 그대로 Stack 자료구조를 사용하고 있습니다.

(JavaScript는 싱글 쓰레드이기 때문에 하나의 Call Stack만 존재합니다.)

 

JavaScript가 실행되면 Global Excution Context가 Call Stack에 push합니다. 이후 사용자가 작성한 코드에서 함수가 호출될 때마다 Call Stack에 push, pop을 진행합니다.

예제를 통해 설명해드리겠습니다.

 

(1) 프로그램 시작

(2) A 함수 호출 및 종료

A 함수 호출
A 함수 종료

(3) B 함수 호출

B 함수 호출

(4) C 함수 호출 및 종료

C 함수 호출
C 함수 종료

(5) B 함수 종료

B 함수 종료

(6) 프로그램 종료

프로그램 종료

 

function A() {
  console.log("A");
}

function B() {
  console.log("B");
  C();
}

function C() {
  console.log("C");
}

A();
B();

3. Environment Records

Environment Records란 lexical nesting structure를 기준으로 특정 변수 및 함수의 식별자의 연결을 정의하는데 사용되는 사양입니다.

간단하게 현재 실행 컨텍스트에서 저장되는 변수 혹은 함수들의 집합이라 생각하시면 됩니다.

 

함수, 블록(block statements), try의 catch 등이 평가될 때마다 해당 코드에 의해 만들어진 identifier binding을 기록하기 위해 새로운 environment reocrd가 생성됩니다.

 

※ identifier binding이란 식별자와 특정 값과의 연결입니다.

Environment Record is a specification type used to define the association of Identifiers to specific variables and functions, based upon the lexical nesting structure of ECMAScript code.
- ECMAScript

 

모든 Environment Record는 [[OuterEnv]]라는 필드를 가지고 있으며, 이는 외부 Environment Record에 대한 참조입니다.

 

4. The Environment Record Type Hierarchy

Environment Record 는 declarative Environment Record, object Environment Record, global Environment Record 라는 세가지 하위 클래스가 있습니다.

declarative Environment Record의 하위 클래스로 Function Environment Recordmodule Environment Record가 존재합니다.

 

(1) declarative Environment Record

declarative Environment Record는 scope에 포함된 variable, constant, let, class, module. import, function declarations 선언에 대한 식별자 바인딩을 제공합니다.

 

(1.1) Function Environment Record

함수의 최상위 스코프(top-level scope)를 나타내는데 사용되는 declarative Environment Record이며, 화살표 함수가 아닌 경우 this 바인딩을 제공합니다.

 

(1.2) module Environment Record

module의 외부 scope를 나타내는데 사용되는 declarative Environment Record입니다.

mutable bindings 및 immutable bindings외에도 immutable import bindings를 제공합니다.

 

(2) object Environment Record

각 object Environment Record는 binding object라는 객체와 연결됩니다.

binding object의 속성에 문자열 타입의 식별자들을 바인딩합니다.

(with문의 사용은 추천되지 않습니다.)

 

with - JavaScript | MDN

with statement 는 명령문의 범위 체인을 확장합니다.

developer.mozilla.org

간단한 예제

console.log(Math.PI);

with (Math) {
  console.log(Math.PI);
}

 

(3) global Environment Record

realm에서 처리되는 가장 바깥 스코프를 나타내는데 사용됩니다.

global Environment Record는 built-in globals, global object의 속성들, 모든 최상위 선언에 대한 바인딩을 제공합니다.

 

*realm이란?

모든 코드는 평가되기 전 realm에 연결되어야 합니다. realm은 객체, global Environment, global Environment의 scope 내에 있는 모든 코드들 등 기타 관련 상태 및 리소스들로 구성됩니다.

'JavaScript' 카테고리의 다른 글

Javascript - Iteration Protocol  (0) 2022.05.29
JavaScript - Prototype  (0) 2022.04.03