Javascript와 실행 컨텍스트(Execution Context)

지드루·2022년 6월 26일
0

Javascript

목록 보기
5/5

서론

자바스크립트에는 실행 컨텍스트라는 개념이 존재한다. 자바스크립트의 여러가지 동작방식을 이해하기 위해서 필요한 핵심 개념이므로 이 기회에 정리하도록 한다.

실행 컨텍스트란?

ECMAScript는 실행 컨텍스트를 다음과 같이 정의하고 있다.

실행 컨텍스트는 실행가능한 코드를 형상화하고 구분하는 추상적인 개념이다.

무슨말인지 이해하기 다소 어려울 수 있다. 이를 좀 더 간단히 표현하면 다음과 같다.

자바스크립트 코드를 실행하기 위해 필요한 환경

환경에 속하는 것들은 변수, 함수, 변수의 유효범위나 this등이 있다.
실행 컨텍스트는 3종류로 나뉜다.

1. 전역 실행 컨텍스트
코드를 실행할 때, 단 한개만 생성되는 전역 컨텍스트이다. Call Stack에 가장 먼저 추가되고, 앱이 종료될 때, 즉 가장 나중에 삭제된다.

2. 함수 실행 컨텍스트
함수가 실행될 때마다 생성되는 실행 컨텍스트 이다. 함수 실행이 종료되면 Call Stack에서 제거된다.

3. Eval 컨텍스트
eval함수로 실행한 코드의 컨텍스트이다.

Call Stack

js엔진은 Context 관리 목적의 Call Stack을 가지고 있다. js는 널리 알려진 것처럼, 단일 스레드 기반이기 때문에 Call Stack은 단 하나만 존재한다. 코드가 실행되는 과정은 다음과 같다.

  1. 제어권이 실행가능한 코드로 옮겨지면, 실행 컨텍스트 스택이 생성된다.
  2. 우선 전역 실행 컨텍스트가 실행 컨텍스트 스택에 쌓이게 된다. 이 컨텍스트는 애플리케이션이 종료될때 까지 유지된다.
  3. 함수를 호출하면 해당 함수에 대한 실행 컨텍스트가 스택에 쌓이게 된다.
  4. 함수가 종료되면 해당 함수의 실행 컨텍스트는 파기된다.

실행 컨텍스트의 요소

실행 컨텍스트는 다음과 같은 요소로 이루어져있다.

1. Lexical Environment
정적 환경(lexical environment)은 컨텍스트가 생성될 때 생성되는 것으로, 식별자와 값이 매핑되는 곳이다.

let, const로 선언된 변수가 관리된다. 이 때, 변수는 메모리에 매핑되지만 초기값이 할당되지는 않는다. 변수가 메모리에 매핑되고 초기값이 할당될 때까지의 텀을 TDZ(Temporal Dead Zone)이라 한다.

2. Variable Environment
Lexical Environment와 거의 동일한 값을 가진다. var로 선언된 변수가 메모리에 매핑되며, 초기값으로 undefined가 할당된다. 즉, 변수 값이 할당되기전 변수에 접근하게 되면 undefined가 반환된다.

또, 선언형 함수가 메모리에 매핑되며, 함수 전체가 메모리에 할당되게 된다.

Environment의 역할

위 Environment들은 다음과 같은 일을 한다.

1. Environment Records
실행 컨텍스트가 생성될 때, js 엔진은 실행에 필요한 정보를 담을 객체를 생성하는데, 이것이 Environment Records 이다. Environment Records는 Environment안에 함수와 변수를 기록한다.

  • Declarative environment record (선언적 환경 레코드) - 변수와 함수 선언을 저장하는 곳, 이곳에 this, super 등의 식별자 바인딩이 저장된다.
  • Object environment record (객체 환경 레코드) - 전역 환경에서 사용되는 프로퍼티. 글로벌 객체를 매핑한다.
  • Global Environment Record (전역 환경 레코드) - 전역 객체의 프로퍼티 및 스크립트 내의 모든 최상위 선언에 대한 바인딩 제공

2. Reference to the outer environment
외부 환경 참조는 일종의 리스트로, 정적 스코프(lexical scope)를 기준으로 상위 스코프의 정적 환경(Lexical Environment)을 참조한다. 가장 먼저 생성되는 전역 컨텍스트는 null을 참조하고 있다. 그리고 함수 컨텍스트가 생성될 때, 상위 스코프에 해당하는 정적 환경을 참조값으로 가지게 된다.

이 일련의 참조리스트는 변수나 함수를 탐색할 때 사용된다. 현재 정적 환경에 해당하는 변수나 함수가 없다면 스코프 체인을 자신부터 순서대로 따라 해당 값을 찾게 되는 것이다. 이를 스코프 체인이라 한다.

주의할 점으로는, 참조값의 결정은 함수 호출 위치가 아니라 함수가 선언된 위치에 따라 결정된다는 사실이다.

3. this Binding
this의 값이 결정된다. 전역 실행 컨텍스트의 this는 global object 이고, 함수 실행 컨텍스트에서는 함수가 어떻게 호출되었는지에 따라 달라진다. 만약 함수가 생성자같은 object reference로 호출되었다면 this는 해당 객체를 가리키며, 아니라면 global object를 가리키게 된다. (strict mode에서는 undefined를 가리킨다.)

0개의 댓글