모던자바스크립트 DeepDive : 23장 실행컨텍스트

te-ing·2022년 4월 22일
0
post-thumbnail

실행 컨텍스트 요약

  • 실행할 코드에 제공할 환경 정보들을 모아놓은 객체
  • 자바스크립트의 동적 언어로서 성격을 가장 잘 파악할 수 있는 개념

자바스크립트는 실행 컨텍스트가 활성화되는 시점에 다음과 같은 현상이 발생한다.

  • 호이스팅이 발생한다(선언된 변수를 위로 끌어올린다)
  • 외부 환경 정보를 구성한다
  • this 값을 설정한다.

(참고)


소스코드의 타입

ECMAScript 사양은 소스코드를 전역코드, 함수코드, eval 코드, 모듈코드 4가지 타입으로 구분한다.


소스코드의 평가와 실행

자바스크립트 엔진은 소스코드를 소스코드의 평가소스코드의 실행 과정으로 나누어 처리한다. 평가 과정에서 실행 컨텍스트를 생성하고, 변수, 함수 등의 선언문만 먼저 실행하여 생성된 변수를 실행 컨텍스트가 관리하는 스코프에 등록한다.


실행 컨텍스트

  1. 선언에 의해 생성된 모든 식별자를 스코프를 구분하여 등록하고 상태 변화를 지속적으로 관리할 수 있어야 한다.
  2. 스코프는 중첩관계에 의해 스코프 체인을 형성해야 한다. 즉, 스코프 체인을 통해 상위 스코프로 이동하며 식별자를 검색할 수 있어야 한다.
  3. 현재 실행 중인 코드의 실행 순서를 변경할 수 있어야 하며 다시 되돌아갈 수도 있어야 한다.

실행 컨텍스트는 위와 같이 소스코드를 실행하는데 필요한 환경을 제공하고 코드의 실행 결과를 실제로 관리하는 영역이다. 이때 식별자와 스코프는 실행 컨텍스트의 렉시컬 환경으로 관리하고 코드 실행 순서는 실행 컨텍스트 스택으로 관리한다.


실행 컨텍스트 스택

const x = 1;
function foo () { 
	const y = 2;
	function bar () {
		const z = 3;
		console.log(x + y + z);
	}
	bar();
}
foo(); // 6
12345
bar 함수 실행 컨텍스트
foo 함수 실행 컨텍스트foo 함수 실행 컨텍스트foo 함수 실행 컨텍스
전역 실행 컨텍스트전역 실행 컨텍스트전역 실행 컨텍스트전역 실행 컨텍스트전역 실행 컨텍스트
  1. 전역 코드의 평가와 실행
    전역 변수 x와 전역 함수 foo는 전역 실행 컨텍스트에 등록된다. 이후 전역 코드가 실행되기 시작하여 전역 변수 x에 값이 할당되고 전역 함수 foo가 호출된다.
  2. foo 함수 코드의 평가와 실행
    전역코드의 실행이 일시 중단되고, foo 함수의 코드를 평가하여 foo 함수 실행 컨텍스트를 실행하고 스택에 푸쉬한다. 이때 y와 bar가 foo 함수 실행 컨텍스트에 등록된다. 이후 foo 함수가 실행되면서 y에 값이 할당되고 bar가 호출된다.
  3. bar 함수 코드의 평가와 실행
    bar가 호출되면서 foo 함수의 실행이 일시 중단되고 bar 함수의 코드를 평가하여 bar 함수 실행 컨텍스트가 실행되며 스택에 푸시한다. 이때 z가 bar 함수 실행 컨텍스트에 등록된다. 이후 bar 함수가 실행되면서 z에 값이 할당되고 console.log를 호출한 뒤 bar 함수가 종료된다.
  4. foo 함수 코드로 복귀한 후 bar 함수 실행컨텍스트를 실행 컨텍스트 스택에서 팝하여 제거한 뒤 foo 함수는 종료된다.
  5. 전역 코드로 복귀한 후 foo 함수 실행컨텍스트를 실행 컨텍스트 스택에서 팝하여 제거하면 실행 컨텍스트에는 아무것도 남지 않게 된다.

렉시컬 환경

스코프와 식별자를 관리하는 렉시컬 환경은 객체 형태의 스코프를 생성하여 식별자를 키로 등록하고 식별자에 바인딩된 값을 관리한다. 렉시컬 환경은 환경레코드(Environment Record), 외부렉시컬 환경에 대한 참조(Outer Lexical Environment Reference) 두 개의 컴포넌트로 구성되는데, 환경 레코드는 스코프에 포함된 식별자를 등록하고 등록된 식별자에 바인딩된 값을 관리하는 저장소다. 외부 렉시컬 환경에 대한 참조는 외부 렉시컬 환경, 즉 해당 실행 컨텍스트를 생성한 소스코드를 포함하는 상위 코드의 렉시컬 환경을 참조하여 단방향 링크드 리스트인 스코프 체인을 구현한다.

profile
병아리 프론트엔드 개발자🐣

0개의 댓글