- 코드는 평가, 실행(런타임) 단계로 진행되는데 렉시컬 환경은 평가 단계 이전에 생성
- 평가 시 var로 선언한 변수는 undefined, 함수 선언문은 함수 코드 내용
전역 렉시컬 환경
- 객체 환경 레코드
- BindingObject: var 로 선언한 변수 - undefined, 함수 선언문 - 코드 내용
- 선언적 환경 레코드 : const, let 선언한 변수 - uninitialized
- this 바인딩 : 전역 객체(global 혹은 window)
- 외부 렉시컬 환경 참조 : 상위 렉시컬 환경 참조
함수 렉시컬 환경
- 함수 환경 레코드 : var, const, let 으로 선언한 변수
- this 바인딩 : 전역 객체(global 혹은 window)
- 외부 렉시컬 환경 참조 : 상위 렉시컬 환경 참조
블록 렉시컬 환경
- 선언적 환경 레코드 : const, let 으로 선언한 변수
(var로 선언한 변수는 블록이 선언된 함수(또는 전역) 렉시컬 환경의 함수 환경 레코드에 저장)
function foo(){
if(true){
var x = 1;
}
- 외부 렉시컬 환경 참조 : 상위 렉시컬 환경 참조
실행 컨텍스트
> ㅁㅁ 렉시컬 환경
> 환경 레코드
함수 실행 컨텍스트에서 호출된 console.log(a+b+c)
console
객체 찾기
- 함수 렉시컬 환경의 함수 환경 레코드에서 검색
- 없으면 상위 렉시컬 환경으로 이동
- 전역 렉시컬 환경에 도달한 경우 객체 환경 레코드 -> BindingObject -> 전역 객체 에서 검색
log
메서드 검색
- console 객체 에서 검색
- 없으면 찾을때 까지 .proto 로 이동
a+b+c
평가
- a, b, c 식별자를 스코프 체인을 통해서 검색
- 메서드 실행