📒

[코어 자바스크립트] 02. 실행 컨텍스트

실행 컨텍스트

실행할 코드에 제공할 환경 정보들을 모아놓은 객체
즉, 식별자를 등록하고 관리하는 스코프와 코드 실행 순서 관리를 구현한 매커니즘
어떤 컨텍스트가 활성화되는 시점에 선언된 변수를 위로 끌어올리고(호이스팅), 외부 환경 정보를 구성하고, this 값을 설정.
동일한 환경에 있는 코드들을 실행할 때 필요한 환경 정보들을 모아 컨텍스트를 구성하고 이를 콜 스택에 쌓아올림
실행 컨텍스트를 구성할 수 있는 방법
1.
자동으로 생성되는 전역 공간
2.
함수 실행하기
3.
eval() 실행하기
자바스크립트 엔진은 소스코드를 두개의 과정으로 나누어 처리
소스코드 평가
실행 컨텍스트를 생성
변수나 함수 등의 선언문만 먼저 실행해 식별자를 렉시컬환경의 환경 레코드에 등록함
소스코드 실행
소스코드 평가가 끝난 후 선언문을 제외한 소스코드가 순차적으로 실행 (런타임)
이때 소스코드 실행에 필요한 정보는 실행 컨텍스트 내 스코프에서 검색해 취득
처음 자바스크립트 코드를 실행하면 전역 컨텍스트가 콜 스택에 담긴다
한 줄씩 읽으면서 함수가 실행되면 실행 컨텍스트가 활성화되면서 자바스크립트 엔진은 해당 컨텍스트에 관련된 코드들을 실행하는데 필요한 환경 정보를 수집해서 실행 컨텍스트 객체에 저장한다.
실행 컨텍스트는 활성화되는 시점에 valiableEnvironment, LexicalEnvironment, ThisBinding의 세 가지 정보를 수집한다.
VariableEnvironment
현재 컨텍스트 내의 식별자들에 대한 정보 + 외부 환경 정보.
선언 시점의 LexicalEnvironment의 스냅샷으로 변경사항은 반영되지 않고 초기 상태를 유지함
environmentRecord, outer-EnvironmentReference의 스냅샷으로 구성
LexicalEnvironment
식별자와 식별자에 바인딩된 값, 상위 스코프에 대한 참조를 기록
처음에는 VariableEnvironment를 그대로 복사해서 만들지만 변경 사항이 실시간으로 반영됨
environmentRecord 환경 레코드
현재 컨텍스트와 관련된 코드의 식별자 정보들이 저장됨. 매개변수의 이름, 함수선언, 변수명 등이 담긴다.
컨텍스트 내부 전체를 처음부터 끝까지 쭉 훑어나가며 순서대로 수집
outerEnvironmentReference 외부 환경 참조
현재 호출된 함수가 선언될 당시의 lexicalEnvirionment를 참조한다. 즉 상위 스코프를 가리킴
연결리스트의 형태
thisBinding
실행 컨텍스트의 thisBinding에는 this로 지정된 객체가 저장된다.
코드가 실행되기 전에 자바스크립트 엔진은 해당 환경에 속한 코드의 변수명들을 모두 알 수 있다.
즉, 자바스크립트 엔진은 식별자들을 코드 최상단으로 끌어올려진 것처럼 작동함 ⇒ 호이스팅
코드가 어떻게 실행될지 예측하려면 선언부를 미리 위로 올려서 생각해본다면 예측하기 쉬워진다.
실행 컨텍스트는 스택 자료구조로 관리된다

전역 객체 생성

전역 객체는 전역 코드가 평가되기 이전에 생성
전역 객체에는 빌트인 전역 프로퍼티와 빌트인 전역함수, 표준 빌트인 객체가 추가

전역 환경 레코드

var 키워드와 ES6의 let, const 키워드로 선언한 전역 변수를 구분하여 관리하기 위해 객체 환경 레코드와 선언적 환경 레코드로 구성되어있음
객체 환경 레코드 object environment record
var 키워드로 선언한 전역 변수와 함수 선언문으로 정의한 전역 함수, 빌트인 전역 프로퍼티와 빌트인 전역 함수, 표준 빌트인 객체를 관리
선언적 환경 레코드 declarative environment record
let, const 키워드로 선언한 전역 변수를 관리

함수 선언문

function 정의부만 존재하고 별도의 할당 명령이 없는 선언방법
반드시 함수명이 정의되어있어야 함
함수명은 오직 함수 내부에서만 접근 가능하지만 함수 선언문의 경우에는 함수 생성 시 자동으로 함수명과 동일한 식별자를 생성해 함수 객체를 저장한다.

함수 표현식

정의한 function을 별도의 변수에 할당하는 방식
함수명이 없어도 됨. 함수명이 있으면 기명 함수 표현식, 없으면 익명 함수 표현식이라고 한다.

스코프

식별자에 대한 유효 범위
ES5까지의 자바스크립트는 함수 스코프

스코프 체인

스코프를 안에서부터 바깥으로 차례로 검색해나가는 것
식별자 검색 시 스코프 체인 상의 첫 번째 인자부터 검색하고 반환. 찾으면 이후 외부의 동일한 이름의 식별자에 더이상 접근할 수 없음. ⇒ 변수 은닉화
전역 변수
전역 공간에서 선언한 변수
지역 변수
함수 내부에서 선언한 변수
호이스팅
코드 해석을 좀 더 수월하게 하기 위해 environmentRecord의 수집 과정을 추상화