소스코드 평가과정에서 생성하는 것으로 소스코드를 실행하는 데 필요한 환경을 제공하는 영역
즉, 식별자를 등록하고 관리 스코프와 코드 실행 순서를 관리하는 객체다.
식별자와 식별자에 바인딩된 값, 상위 스코프에 대한 참조값을 기록하는 자료구조
즉, 식별자와 스코프를 관리함.
EnvironmentRecord
)에 저장OuterLexicalEnvironmentReference
)에 저장코드의 실행 순서를 관리하는 스택
즉, 코드의 실행 순서대로 실행 컨텍스트 스택에 실행 컨텍스트를 넣음
전역 객체
생성전역 실행 컨텍스트
생성 후 실행 컨텍스트 스택
에 푸시전역 렉시컬 환경
생성 후 전역 실행 컨텍스트
에 바인딩객체 환경 레코드
생성 후 BindingObject
에 전역 객체
바인딩선억적 환경 레코드
생성 후 let
or const
를 이용해 선언한 전역 변수 등록this
바인딩외부 렉시컬 환경
에 대한 참조 결정함수 실행 컨텍스트
생성 후 실행 컨텍스트 스택
에 푸시 ( 제어권을 넘겨받음 )함수 렉시컬 환경
생성 후 함수 실행 컨텍스트
에 바인딩함수 환경 레코드
생성 후 매개변수, arguments, 함수내부 지역변수들 등록this
바인딩 ( [[thisValue]]
내부슬롯에 바인딩 )외부 렉시컬 환경
에 대한 참조 결정 ( [[Environment]]
내부슬롯에 저장 )식별자를 사용할 경우 현재 실행 중인 실행 컨텍스트의 렉시컬 환경에서 식별자를 검색한다.
만약 없을 경우 외부 렉시컬 환경
에 대한 참조가 가리키는 렉시컬 환경으로 이동하여 검색하는 것을 반복한다.
전역 렉시컬 환경에서 찾지못한다면 외부 렉시컬 환경
에 대한 참조가null
값이라 undefined
를 반환한다.
만약 함수의 실행 코드의 끝을 만나 종료를 하게된다면 현재 함수의 실행컨텍스트가 스택에서 제거되게 된다.
여기서 중요한점은 실행 컨텍스트 스택에서 제거되는 것이지 실행컨텍스트 자체가 제거되는 아니라는 것이다.
가비지컬렉터가 메모리할당을 해제하는 조건이 해당 값을 참조하는 값이 없을 때이다.
즉, 실행 컨텍스트에 정의되어있는 변수들을 만약 외부에서 사용하게 된다면 실행 컨텍스트를 제거하지 않는다는 것이고 이게 클로저의 원리다. ( 다음장에서 더 자세하게 다룸 )
실행 컨텍스트 스택에서 전역 실행 컨텍스트가 제거되고 아무것도 실행 컨텍스트에 남지 않게된다.
이 때 비동기 코드들이 실행된다. ( 이후에 자세하게 다룸 )
if문
같은 블록에 let
or const
로 변수를 선언하게 되면 블록 렉시컬 환경
을 생성하고 현재 실행 컨텍스트가 생성한 블록 렉시컬 환경
에 대한 참조값을 가지게 된다.
기존 참조값은 블록 렉시컬 환경
의 외부 렉시컬 환경
에 들어간다.
따라서 블록 레벨 스코프를 사용할 수 있는 것이다.