WEB/JavaScript
[자바스크립트] 실행 컨텍스트
jimyu
2024. 7. 20. 00:19
소스코드의 종류
- 소스코드의 타입에 따라 실행 컨텍스트를 생성하는 과정과 내용이 다르다.
- 전역 코드
- 전역 변수 및 전역 함수를 전역 객체와 연결
- 함수 코드
- 지역 스코프를 전역 스코프 체인의 일원으로 연결
- eval 코드
- strict mode에서 독자적인 스코프 생성
- 모듈 코드
- 모듈별 독립적인 모듈 스코프 생성
실행 컨텍스트란
- 코드의 실행환경에 대한 여러가지 정보를 담고 있는 개념으로, 간단히 말하자면 자바스크립트 엔진에 의해 만들어지고 사용되는 코드 정보를 담은 객체의 집합이라고 할 수 있다.
실행 컨텍스트의 역할
- JS 엔진의 소스코드 실행 과정
- 전역 코드 평가(전역 실행 컨텍스트 생성)
- 전역 코드 실행
- 함수 호출되면 함수 코드 평가(함수 실행 컨텍스트 생성)
- 함수 코드 실행
- 소스코드를 평가하고(이때 선언문만 먼저 실행) 실행 컨텍스트를 생성한다. 이후 소스코드를 실행하는데, 코드 실행 시에 필요한 정보를 실행 컨텍스트가 관리하는 스코프에서 검색해서 가져온다. 실행 결과는 또 실행 컨텍스트가 관리하는 스코프에 등록된다.
- 즉, 실행 컨텍스트는 소스코드를 실행할 때 필요한 식별자, 스코프, 코드 실행순서(되돌리거나 함수 호출에 의한 실행 순서 변경 등에 필요)를 제공하고 코드의 실행 결과를 관리하는 역할을 한다.
- 이때 식별자와 스코프는 실행 컨텍스트의 렉시컬 환경으로, 코드 실행 순서는 실행 컨텍스트 스택으로 관리한다.
실행 컨텍스트 스택
- 생성된 실행 컨텍스트를 관리하는 스택 자료구조
- 실행 컨텍스트 스택은 코드의 실행 순서를 관리한다.
- 무조건 최상위 실행 컨텍스트가 현재 실행 중인 코드의 실행 컨텍스트이다. 이를 running execution context(실행 중인 실행 컨텍스트)라고 한다.
렉시컬 환경
- 실행 컨텍스트를 구성하는 컴포넌트로, 스코프와 식별자를 관리한다.
- 식별자, 식별자에 바인딩된 값, 상위 스코프에 대한 참조를 기록한다.
- 키(식별자)-값을 갖는 객체 형태의 스코프를 만든다.
- 실행 컨텍스트는 LexicalEnvironment 컴포넌트 & Variable Environment 컴포넌트로 구성된다.
- 생성 초기에는 둘이 하나의 동일한 렉시컬 환경을 참조한다. 하지만 이후 여러 상황을 거치며 VariableEnrionment가 참조하는 렉시컬 환경이 달라질 수 있다.
- 렉시컬 환경의 구성요소
- 환경 레코드 : 식별자와 그에 바인딩된 값 관리하는 저장소
- 외부 렉시컬 환경에 대한 참조 : 상위 스코프를 가리킨다. 단방향 링크드 리스트인 스코프 체인을 구현한다.
실행 컨텍스트 생성 및 식별자 검색 과정
전역 객체 생성
전역 코드 평가
전역 실행 컨텍스트 생성
전역 렉시컬 환경 생성
- 전역 환경 레코드 생성
- 객체 환경 레코드 생성
- 선언적 환경 레코드 생성
- this 바인딩
- 외부 렉시컬 환경에 대한 참조 결정
전역 코드 실행
함수 코드 평가
함수 실행 컨텍스트 생성
함수 렉시컬 환경 생성
- 함수 환경 레코드 생성
- this 바인딩
- 외부 렉시컬 환경에 대한 참조 결정