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