렉시컬 환경 컴포넌트의 생성은, 엔진이 function, with문, try-catch문을 만났을 때 이뤄진다.
렉시컬 환경 컴포넌트는 환경 레코드(ER:Environment Record)와 외부 렉시컬 참조(OLER: Outer Lexical Environment Reference)로 구성된다.
환경 레코드와 외부 렉시컬 참조에 name : value로 저장된다.
환경 레코드에는 아래에 하나의 계층이 더 있다. 환경 레코드에는 함수 내부의 변수와 함수가 저장된다.
외부 렉시컬 참조에는 함수가 속한 오브젝트에 있는 변수와 함수가 저장된다.
렉시컬 환경 컴포넌트 설정
환경 레코드에 함수 안의 변수와 함수를 기록한다.
외부 렉시컬 환경 참조에는 function Object의 [[Scope]]에 있는 것을 넣는다.
function Object를 만들 때, 내부 프로퍼티 [[Scope]]가 설정된다.
[[Scope]]에는 함수가 속한 오브젝트에 존재하는(함수가 가지고 있는 범위가 아니라) 변수와 함수를 {name : value}로 저장되어 있다.
이제 이 함수가 호출되면 내부 프로퍼티에 담긴 내용을 외부 렉시컬 환경 참조에 설정하는 것이다.
이렇게 실행 컨텍스트의 렉시컬 환경 참조 안에, 외부와 내부의 변수와 함수가 저장되게 된다. 즉, 함수 안과 밖의 함수와 변수를 모두 사용할 수 있게 된 것, 실행 콘텍스트 바깥으로 나갈 이유가 없게 되었다.(우리가 그렇게 코딩만 한다면, 엔진 처리가 빨라질 수 있다는 것이다)
변수 환경 컴포넌트
실행 컨텍스트 초기화 단계에서, 렉시컬 환경 컴포넌트와 같게 설정한다.
변수 환경 컴포넌트는 초기값을 복원할 때 사용하기 위함이다.
함수가 실행되면, 실행 결과를 렉시컬 환경 컴포넌트에 설정하게 된다. 변수에 할당한 값이나 함수 자체가 변할 수 있게 된다.
다음에 실행했을 때 똑같은 결과를 내기 위해선 초기값이 같아야된다. 따라서 엔진은 실행이 끝나면?? 언젠가 렉시컬 환경 컴포넌트를 초기화 해주는데, 이때 변수 환경 컴포넌트에 담긴 값으로 초기화를 한다.