JavaScript
Execution Context

실행 컨텍스트에 대해 설명해주세요

실행 컨텍스트는 해당 코드가 평가되고 실행되는 환경을 의미한다.

실행할 코드에 제공할 환경 정보들을 모아놓은 객체인 것이다.

코드를 실행하기 위해 필요한 정보를 모아 놓은 컨텍스트들을 콜스택에 쌓아 올리고, 스택에서 pop하면서 실행된다.

실행 컨텍스트는 크게 3가지 방식으로 생성된다.

  • 프로그램이 실행될 때
  • 함수가 호출될 때
  • eval 함수가 호출될 때 (eval()은 인자로 받은 코드를 caller의 권한으로 수행하는 위험한 함수)

내부 구성

렉시컬 환경(Lexical Environment), 변수 환경(Variable Environment), ThisBinding으로 구성되어 있다.

렉시컬 환경

함수 실행 도중 변경되는 사항을 즉시 반영한다.

변수 환경

최초 실행 시(선언 시점)의 스냅샷을 유지한다.

변경 사항은 반영되지 않는다.

렉시컬 환경과 변수 환경의 구성

이 둘은 외부 참조 환경(outerEnvironmentReference)과 환경 레코드(environmentRecord)로 구성된다.

실행 컨텍스트를 생성할 때 변수 환경에 정보를 먼저 담은 다음, 이를 그대로 복사해서 렉시컬 환경을 만들고, 이후에는 렉시컬 환경을 주로 활용한다.

외부 참조 환경

자바스크립트의 스코프 체인과 연관된 개념으로, 상위 실행 컨텍스트의 렉시컬 환경에 연결되어 있다.

외부 참조 환경은 연결리스트 형태를 지닌다.

'선언 시점의 렉시컬 환경'을 계속 찾아 올라가면 마지막엔 전역 컨텍스트의 렉시컬 환경이 있을 것이다.

각 외부 참조 환경은 오직 자신이 선언된 시점의 렉시컬 환경만 참조하고 있으므로 가장 가까운 요소부터 차례대로만 접근할 수 있다.

다른 순서로 접근하는 것은 불가능하다.

환경 레코드

선언적 환경 레코드객체 환경 레코드로 구성되어 있다.

현재 컨텍스트와 관련된 코드의 식별자 정보들이 저장된다.

컨텍스트 내부 전체를 처음부터 끝까지 쭉 훑어 나가며 순서대로 수집한다.

ThisBinding

현재 실행 중인 코드의 컨텍스트에서 참조하는 객체를 나타낸다.

함수 내에서 this를 어떻게 호출했느냐에 따라 달라질 수 있다.

작동 방식

크게 생성 단계와 실행 단계로 구분할 수 있다.

생성 단계에서는 this가 바인딩되고, 스코프 체인을 위한 외부 환경 참조를 결정한다. 이 과정에서 렉시컬 환경과 변수 환경의 환경 레코드에 식별자 정보를 수집한다.

이때 환경 레코드에 변수와 같은 식별자들이 실행 단계 이전에 수집되기 때문에 실제 선언문 이전에 변수에 접근하거나 함수를 호출할 수 있는 호이스팅이 발생한다.

이후 실행 단계에서 자바스크립트 엔진이 실행 컨텍스트를 기반으로 실제 코드를 실행한다.

GPT로 문장 정리하기

실행 컨텍스트에 대해 알려줘

  • 자바스크립트 코드가 실행될 때 변수, 함수 선언 및 실행 순서 등의 관리를 담당하는 개념
  • 실행 컨텍스트는 전역 컨텍스트, 함수 컨텍스트, Eval 컨텍스트로 나뉨
  • 각 컨텍스트는 변수 객체, 스코프 체인, this 등의 정보를 포함

키워드 정리

  • 렉시컬 환경
  • 변수 환경
  • 외부 참조 환경
  • 환경 레코드

참고 자료

  • 코어 자바스크립트(실행 컨텍스트)