[240329] 22장 실행 컨텍스트 (1)
22장 실행 컨텍스트 (1)
실행 컨텍스트는 자바스크립트의 동작 원리를 담고 있는 핵심 개념
소스코드의 타입
4가지 타입으로 구분
- 전역 코드
- 전역에 존재하는 소스코드 의미
- 전역에 정의된 함수, 클래스 등의 내부 코드는 포함 X
- 최상위 스코프인 전역 스코프를 생성
- var 키워드 전역 변수와 전역 함수를 전역 객체 프로퍼티와 메서드로 바인딩하고 전역 객체와 연결
- 전역 코드가 평가되면 전역 실행 컨텍스트가 생성됨
- 함수 코드
- 함수 내부에 존재하는 소스코드
- 함수 내부에 중첩된 함수, 클래스 등의 내부 코드는 포함 X
- 지역 변수,매개변수, arguments 객체 관리
- 지역 스코프를 전역 스코프에서 시작하는 스코프 체인의 일원으로 연결해야함
- 함수 코드가 평가되면 함수 실행 컨텍스트가 생성
- eval 코드
- 빌트인 전역 함수인 eval 함수에 인수로 전달되어 실행되는 소스 코드 말함
- strick mode 에서 자신만의 독자적인 스코프 생성
- eval 실행 컨텍스트 생성
- 모듈 코드
- 모듈 내부에 존재하는 소스코드
- 모듈 내부의 함수, 클래스 등의 내부 코드는 포함 X
- 모듈별로 독립적인 모듈 스코프 생성
- 모듈 실행 컨텍스트 생성
소스코드의 평가와 실행
자바스크립트 엔진은 소스코드를 2개의 과정으로 나누어 처리
- 소스코드의 평가
- 실행 컨텍스트 생성
- 변수, 함수 등의 선언문만 먼저 실행하여 식별자를 키로 실행 컨텍스트가 관리하는 스코프(렉시컬 환경의 환경 레코드)에 등록
- 소스코드의 실행
- 런타임 시작
- 순차적으로 실행
- 스코프에서 검색해서 필요한 정보 취득
- 변수 값의 변경 등 소스코드의 실행 결과는 다시 실행 컨텍스트가 관리하는 스코프에 등록
실행 컨텍스트의 역할
- 코드가 실행 되려면 스코프, 식별자, 코드 실행 순서 등의 관리가 필요하다.
실행 컨텍스트
가 관리 - 식별자를 등록하고 관리하는 스코프와 코드 실행 순서 관리를 구현한 내부 매커니즘으로, 모든 코드는 실행 컨텍스트를 통해 실행되고 관리된다.
- 식별자와 스코프는 실행 컨텍스트의 렉시컬 환경으로 관리
- 코드 실행 순서는 실행 컨텍스트 스택으로 관리
- 전역 코드 평가
- 선언문만 먼저 실행
- 전역 코드 실행
- 함수가 호출되면 순차적으로 실행되던 전역 코드의 실행을 일시 중단하고 코드 실행 순서를 변경하여 함수 내부로 진입
- 함수 코드 평가
- 지역 변수가 실행 컨텍스트가 관리하는 지역 스코프에 등록
- arguments 객체가 생성되어 지역 스코프에 등록, this 바인딩 결정
- 함수 코드 실행
실행 컨텍스트 스택
const x = 1;
function foo() {
const y = 2;
function bar() {
const z = 3;
console.log(x + y + z);
}
bar();
}
foo(); // 6
- 스택 자료 구조로 관리
- 실행 컨텍스트 스택이라 부른다.
- 코드의 실행 순서 관리
- 소스코드가 평가되면 실행 컨텍스트가 생성되고 실행 컨텍스트 스택의 최상위에 쌓인다.
- 실행 컨텍스트 스택의 최상위에 존재하는 실행 컨텍스트는 언제나 현재 실행 중인 코드의 실행 컨텍스트
- 최상위에 존재하는 실행 컨텍스트는 언제나 현재 실행 중인 코드의 실행 컨텍스트
렉시컬 환경
-
스코프와 식별자를 관리
- 키와 값을 갖는 객체 형태의 스코프를 생성하여 식별자를 키로 등록하고 식별자에 바인딩 된 값 관리
- 즉, 스코프를 구분하여 식별자를 등록하고 관리하는 저장소 역할함
-
실행 컨텍스트는 LexicalEnviroment , VariableEnviroment 컴포넌트로 구성
- 책에서는 구분하지 않고 렉시컬 환경으로 통일해서 설명
- 환경 레코드 (Environment Record)
- 스코프에 포함된 식별자를 등록하고 등록된 식별자에 바인딩된 값을 관리하는 저장소
- 외부 렉시컬 환경에 대한 참조 (OuterLexicalEnvironmentReference)
- 상위 스코프를 가리킴
- 외부 렉시컬 환경에 대한 참조를 통해 단방향 링크드 리스트인 스코프 체인을 구현
실행 컨텍스트의 생성과 식별자 검색 과정
- 전역 객체 생성
- 전역 코드가 평가되기 이전에 생성
- 빌트인 전역 프로퍼티, 빌트인 전역 함수, 표준 빌트인 객체, WebAPI, 호스트 객체 등등
- 전역 객체도 Object.prototype 상속 받음
- 전역 코드 평가
- 전역코드 평가는 다음과 같은 순서로 진행
- 전역 실행 컨텍스트 생성
-
전역 렉시컬 환경 생성
2.1. 전역 환경 레코드 생성
2.1.1 객체 환경 레코드 생성
2.1.2 선언적 환경 레코드 생성
2.2 this 바인딩
2.3 외부 렉시컬 환경에 대한 참조 결정
- let const 키워드로 선언한 전역 변수는 선언적 환경 레코드 관리
- 객체 환경 레코드는 var 변수, 함수 선언문으로 정의한 전역 함수,빌트인 전역 프로퍼티와 빌트인 전역 함수 등을 관리
- BindingObject 는 전역 객체 생성에서 생성된 객체다. var 키워드로 선언한 전역 변수와 함수 선언문으로 정의된 전역 함수는 전역 환경 레코드의 객체 환경 레코드에 연결된 BindingObject를 통해 전역 객체의 프로퍼티와 메서드가 된다.
- 전역코드 평가는 다음과 같은 순서로 진행
Leave a comment