728x90
실행 컨텍스트 execution context 에 대해서
실행 컨텍스트 : 자바스크립트의 동작 원리를 담고 있는 핵심 개념
실행컨텍스트를 이해하면 얻을 수 있는 것들
- 자바스크립트가 스코프를 기반으로 식별자와 식별자에 바인딩된 값을 관리 하는 방식
- 호이스팅이 발생하는 이유
- 클로저의 동작방식
- 태스크 큐와 함께 동작하는 이벤트 핸들러
- 비동기 처리 동작 방식
1. 소스코드의 타입
a. ECMAScript 사양은 소스코드(ECMAScript code)를 4가지 타입으로 구분
=> 소스코드 타입에 따라 실행 컨텍스트 생성 과정, 내용 다르기때문
b. 4가지의 소스코드(실행 가능한 코드)는 실행 컨텍스트 생성
b-1. 전역 코드
- 전역 코드 : 전역 변수를 관리하기 위해 최상위 스코프인 전역 스코프 생성
- var 키워드로 선언된 전역 변수와 함수 선언문으로 정의된 전역함수를 전역 객체의 프로퍼티와 메서드로 바인딩하고 참조하기 위해 전역객체와 연결되어야함
- => 전역코드가 평가되면 전역 실행 컨텍스트 생성
b-2.함수 코드
- 함수 코드 : 지역 스코프 생성, 지역 변수, 매개 변수, arguments 객체 관리
- 생성한 지역 스코프를 전역 스코프에서 시작하는 스코프 체인의 일원으로 연결
- => 함수 코드가 평가되면 실행 컨텍스트 생성
b-3. eval 코드
- eval 코드 : strict mode(엄격모드)에서 자신만의 독자적인 스코프 생성
- => eval 코드가 평가되면 eval 실행 컨텍스트 생성
b-4.모듈 코드
- 모듈 코드 : 모듈별로 독립적인 모듈 스코프 생성
- => 모듈 코드가 평가되면 모듈 실행 컨텍스트 생성
2. 소스코드의 평가와 실행
a. 모든 소스코드를 자바스크립트 엔진은 소스코드를 2개의 과정(소스코드의 평가, 소스코드의 실행)으로 나누어 처리
a-1. 소스코드 평가 과정
- 실행 컨텍스트 생성
- 변수, 함수등의 선언문만 먼저 실행
- 생성된 변수, 함수 식별자를 키로 실행 컨텍스트가 관리하는 스코프(렉시컬 환경의 환경 레코드)에 등록
a-2. 소스코드 평가 과정 끝나면 실행
- 선언문 제외한 소스코드가 순차적으로 실행 시작 === 런타임 시작
- 소스코드 실행에 필요한 정보(변수, 함수의 참조)를 실행 컨텍스트가 관리하는 스코프에서 검색해 취득
- 변수 값의 변경 등 소스코드 실행 경과는 다시 실행 컨텍스트가 관리하는 스코프에 등록
b. 다음과 같은 소스코드가 실행된다면?
var x;
a = 1;
b-1. 소스코드 평가 과정
- 선언문 var x; 먼저 실행
- 생성된 변수 식별자 x는 실행 컨텍스트가 관리하는 스코프에 등록, undifined로 초기화
b-2. 소스코드 실행 과정
- 변수 선언문 var x;는 소스코드 평가 과정에서 이미 실행 완료되었기 때문에 변수 할당문 x=1;만 실행
- 실행컨텍스트가 관리하는 스코프에 x 변수가 등록 확인 => x 변수에 값을 할당하려면 x 변수가 선언된 변수인지 확인 필요해서
- 등록되어있다면 -> 값을 할당하고 할당 결과를 실행 컨텍스트에 등록하여 관리
3. 실행 컨텍스트의 역할
a. 전역 코드 평가
실행 전 전역 코드 평가 과정 : 전역 코드 실행 준비
선언문만 먼저 실행 : 전역코드의 변수 선언문, 함수 선언문 먼저 실행
생성된 전역 변수, 전역함수가 실행 컨텍스트가 관리하는 전역 스코드에 등록됨
var 키워드로 선언된 전역 변수와 함수 선언문으로 정의된 전역함수는 전역 객체의 프로퍼티와 메서드가 됨
b. 전역 코드 실행
전역코드 평가 과정이 끝나면 런타임 시작
- 전역 코드 순차적으로 실행
- 전역 변수에 값이 할당되고 함수 호출
- 함수 호출되면 순차적으로 실행되던 전역 코드 실행 일시중단
- 코드 실행 순서 변경해 함수 내부로 진입
c. 전역 코드 평가
함수 호출에 의해 코드 실행 순서가 변경되어 함수 내부로 진입하면 함수 코드 평가 과정을 통해 함수 코드 실행 준비
- 매개변수와 지역변수 선언문 먼저 실행
- 생성된 매개변수, 지역 변수가 실행 컨텍스트가 관리하는 지역 스코프에 등록
- 함수 내부에서 지역번수처럼 사용할 수 있는 arguments 객체 생성 및 지역 스코프 등록
- this 바인딩 결정
d. 전역 코드 평가
함수 코드 평가 과정이 끝나면 런타임 시작되어 함수 코드가 순차 실행 시작-> 매개변수와 지역변수에 값 할당, console.log 메서드 호출
- console.log 메서드 호출 위해 식별자인 console 스코프 체인을 통해 검색
- 이를 위해 함수 코드의 지역 스코프는 상위 스코프인 전역 스코프와 연결
- console 식별자는 스코프 체인에 등록되어 있지 않고 전역 객체에 프로퍼티에 존재 =>전역 객체의 프로퍼티가 전역 변수처럼 전역 스코프를 통해 검색 가능하다는 것 의미
- log 프로퍼티를 console 객체의 프로토타입 체인을 통해 검색
- console.log 메서드에 인수로 전달된 표현식 a+x+y 가 평가
- a, x, y 식별자는 스코프 체인을 통해 검색
- console.log 메서드의 실행이 종료되면 함수 코드 실행 과정 종료, 함수 호출 이전으로 되돌아가 전역 코드 실행 계속됨
e. 코드 실행되려면
- 선언에 의해 생성된 모든 식별자(변수, 함수, 클래스 등)을 스코프를 구분하여 등록, 상태변화(식별자에 의해 바인딩된 값의 변화) 지속적 관리되어야함
- 스코프는 중첩 관계에 의해 스코프 체인 형성->스코프 체인 통해 상위 스코프로 이동해 식별자 검색할 수 있어야함
- 전역 객체의 프로퍼티도 전역 변수처럼 검색할 수 있어야함
- 함수 호출이 종료되면 함수 호출 이전으로 되돌아가기 위해 현재 실행 중인 코드와 이전 실행 코드를 구분해 관리
- 현재 실행중인 코드의 실행순서를 변경할 수 있어야 하며 다시 되돌아갈 수 있어야함
f. 실행 컨텍스트
- 실행 컨텍스트 : 소스코드를 실행하는데 필요한 환경 제공하고 코드의 실행 결과를 실제로 관리하는 영역
- 실행 컨텍스트 : 식별자(변수, 함수, 클래스 등의 이름)을 등록하고 관리하는 스코프와 코드 실행 순서관리를 구현한 내부 매커니즘
- 모든 코드는 실행 컨텍스트를 통해 실행되고 관리됨
- 식별자와 스코프는 실행 컨텍스트의 렉시컬 환경으로 관리
- 코드 실행 순서는 실행 컨텍스트 스택으로 관리
4. 실행 컨텍스트 스택
실행 컨텍스트 스택이란?
- 생성된 실행 컨텍스트는 스택 자료 구조로 관리됨
- 실행 컨텍스트 스택은 코드 실행 순서 관리
- 실행 컨텍스트 스택의 최상위에 존재하는 실행 컨텍스트는 언제나 현재 실행 중인 코드의 실행 컨텍스트
- 최상위 실행 컨텍스트 = 실행 컨텍스트
- 전역 코드 평가 -> 전역 실행 컨텍스트 생성
- 전역 실행 컨텍스트 생성 중 함수 호출 -> 함수 코드 평가 -> 함수 실행 컨텍스트 생성
a. 전역 코드 평가와 실행
- 자바스크립트 엔진은 전역 코드 평가 -> 전역 실행 컨텍스트 생성 -> 실행 컨텍스트 스택에 푸쉬
- 전역변수 x와 전역 함수 foo는 전역 실행 컨텍스트에 등록
- 전역 코드 실행 -> 전역 변수 x에 값 할당, foo 함수 호출
b. foo 함수 코드 평가와 실행
- 전역함수 foo 함수 호출 -> 전역 코드 실행 일시중단 & 코드의 제어권이 foo 함수 내부로 이동
- 자바스크립트 엔진은 foo 함수 내부의 함수 코드 평가 -> foo 함수 실행 컨텍스트 생성 & 실행 컨텍스트 스택에 푸쉬
- foo 함수의 지역변수 y와 중첩함수 bar가 foo 함수 실행 컨텍스트에 등록
- foo 함수 실행되기 시작하여 지역 변수 y에 값 할당 -> 중첩 함수 bar 호출
c. bar함수 코드 평가와 실행
- 중첩 함수 bar 호출 -> foo 함수 코드 실행 일시 중단 & 코드의 제어권이 bar 함수 내부로 이동
- 자바스크립트 엔진은 bar 함수 내부의 함수 코드 평가 -> bar 함수 실행 컨텍스트 생성 & 실행 컨텍스트 스택에 푸쉬
- bar 함수의 지역 변수 z 가 bar 함수 실행 컨텍스트에 등록
- bar 함수 실행되기 시작하여 지역 변수 z에 값 할당 -> console.log 메소드 호출 & bar 함수 종료
d. foo 함수 코드로 복귀
- bar 함수 종료 -> 코드 제어권이 다시 foo 함수로 이동
- 자바스크립트 엔진은 bar 함수 실행 컨텍스트를 실행 컨텍스트 스택에서 팝하여 제거
- foo 함수 종료
e. 전역 코드로 복귀
- foo 함수 종료 -> 코드 제어권이 다시 전역 코드로 이동
- 자바스크립트 엔진은 foo 함수 실행 컨텍스트를 실행 컨텍스트 스택에서 팝하여 제거
- 전역 실행 컨텍스트도 실행 컨텍스트 스택에서 팜되어 실행 컨텍스트 스택에는 아무것도 남아있지 않음
5. 렉시컬 환경
a. 렉시컬 환경이란?
- 렉시컬 환경 : 식별자와 식별자에 바인딩된 값, 스코프에 대한 참조를 기록하는 자료구조로 실행 컨텍스트를 구성하는 컴포넌트
- 렉시컬 환경은 스코프와 식별자 관리
- 렉시컬 환경은 키와 값을 갖는 객체 형태의 스코프(전역, 함수, 블록 스코프) 생성해 식별자를 키로 등록, 식별자에 바인딩된 값 관리
- 렉시컬 환경은 스코프 구분해 식별자를 등록하고 관리하는 저장소 역할을 하는 렉시컬 스코프 실체
b. 실행 컨텍스트는 LexicalEnvironment 컴포넌트와 VariableEnvironment 컴포넌트로 구성
- 생성 초기에 LexicalEnvironment 컴포넌트와 VariableEnvironment 컴포넌트는 하나의 동일한 렉시컬 환경 참조
- 이후 몇가지 상황 만나면 VariableEnvironment 컴포넌트를 위한 새로운 렉시컬 환경 생성 -> 이후 두 컴포넌트의 내용이 달라질 수 있음
- 하지만 이번 장에서는 둘을 구분하지 않고 렉시컬 환경으로 통일해 설명
c. 렉시컬 환경은 두개의 컴포넌트로 구성
환경 레코드
- 환경 레코드 : 스코프에 포함된 식별자 등록, 등록된 식별자에 바인딩된 값 관리하는 저장소
- 환경 레코드는 소스코드의 타입에 따라 관리하는 내용 차이 ㅇ
외부 렉시컬 환경에 대한 참조
- 외부 렉시컬 환경에 대한 참조는 상위 스코프 가리킴
- 상위 스코프 : 외부 렉시컬 환경 = 해당 실행 컨텍스트 생성한 소스코드를 포함하는 상위 코드의 렉시컬 환경
- 외부 렉시컬 환경에 대한 참조를 통해 단방향 링크드 리스트인 스코프 체인 구현
모던 자바스크립트 딥다이브 책을 정리한 내용입니다!!
728x90
'개념 정리 > 모던 자바스크립트 딥다이브' 카테고리의 다른 글
모던 자바스크립트 : 원시값과 객체의 비교 (0) | 2023.11.01 |
---|---|
모던 자바스크립트 : 실행 컨텍스트의 생성과 식별자 검색 과정 (0) | 2023.10.31 |
모던 자바스크립트 : 객체리터럴 (0) | 2023.10.20 |
모던 자바스크립트 : 타입변환과 단축평가 (0) | 2023.10.18 |
모던 자바스크립트 : 제어문 (0) | 2023.10.17 |