자바스크립트 엔진 : 소스 코드를 평가 → 실행 하는 과정으로 처리
소스 코드 평가시 , 실행 컨텍스트 생성, 변수 함수 e등 이 선언문 먼저 실행해 스코프에 등록.
런타임 : 소스평가 과정 이후 순차적으로 실행, 필요시 실행컨텍스트 스코프에서 변수 검색 . 실행 결과는 다시 실행컨텍스트 스코프에 등록됨
ECMAScript 4가지 타입
4가지 코드가 평가된후 실행 컨텍스트 생성됨
전역 코드 : 전역에 존재하는 소스코드 (함수, 클래스 제외), 전역 객체의 프로퍼티와 메서드로 바인딩 하고 참조위해 전역객체와 연결. 전역 코드 평가 → 실행컨텍스트 생성
cf)전역 객체는 전역코드 평가 이전 생성되고 전역객체도 Object.prototype 상속 받음
함수코드: 함수 내부 존재하는 소스코드 (함수 내부 중첩함수, 클래스 제외) 지역 스코프 생성, 지역변수 매개변수, arguments객체 관리 . 지역 스코프를 전역 스코프의 체인의 일원으로 연결
eval 코드 : 전역함수 eval에 인수로 전달되어 실행되는 코드 → strict mode에서 독자적 스코프 생성.
모듈코드 : 모듈 내부 존재하는 소스코드
식별자 등록, 관리하는 스코프와 코드 실행 순서 관리 구현한 내부 매커니즘으로 모든 코드는 실행 컨텍스트 통해 실행, 관리됨
식별자, 바인딩값 , 상위 스코프에 참조를 기록하는 자료 구조로 실행 컨텍스트를 구성하는 컴포넌트. 즉, 스코프와 식별자 관리
렉시컬환경은 키:값 형태의 스코프(전역, 함수, 블록 스코프) 생성해 식별자를 키로등록하고 식별자에 바인딩된 값 관리.
실행 컨테스트는 LexicalEnviroment, VariableEnviroment 컴포넌트로 구성되어있다. 생성초기 위 둘은 하나의 동일한 Lexical Enviroment를 참조, 상황에 따라 둘의 컴포넌트 내용 달라지기도함
컴포넌트로는 (EnviromentRecod, OuterLexicalEnviromentReference) 두가지 있다
EnviromentRecod :식별자 등록, 바인딩된값 관리 저장소. 내부 슬롯에 this가 바인딩됨. [[ GlobalThisValue ]]
OuterLexicalEnviromentReference :상위 스코프(해당 실행 컨텍스트 생성한 소스코드 포함하는 상위코드 렉시컬 환경)가리킴 , 단방향 Likned listed In Scope chain 구현 스코프 체인의 종점. 전역렉시컬 환경에서 검색불가능한건 식별자 참조 에러 발생
객체환경 레코드 : var로 선언한 변수, 선언문, 빌트인 전역함수/전역 프로퍼티
선언적 환경레코드 : let const로 선언한 전역 변수. 특히 const로 선언한 변수는 선언과 초기화 단계가 분리되어진행. 런타임이 변수 선언문에 도달하기 까지 일시적 사각지대(Temporal Dead Zone) 에 빠짐. let const도 호이스팅 발생하나, TDZ 때문에 참조가 불가능한것
전역 함수는 BinaryObject를 통해 객체의 프로퍼티, 메서드가 됨
예 window.alert
코드 평가 시점에 BindngObject를 통해 전역객체에 변수를 식별자 키로 등록 → undefined 바인딩 해 변수 호이스팅 발생 단, 변수 선언문 이전에 참조한 변수의 값은 undfined.
함수 선언문에서 정의된 함수 평가 → 동일한 이름의 식별자 를 BindngObject로 전역 객체 에 키로 등록, 함수 객체 즉시 할당. 즉 함수 선언문으로 정의한 함수는 함수 선언문 이전에 호출 가능
=> 이게 변수 호이스팅, 함수 호이스팅 차이점
실행 컨텍스트 스택에서 실행하던 실행컨텍스트 제거되었다고 렉시컬 환경까지 즉시 소멸하지 않음. 객체를 포함한 모든 값은 참조되지 않을때 GC에의해 해제되어 소멸