Enviromnet Record
실행컨텍스트 : {
렉시컬환경컴포넌트 : {
환경레코드 : {}
외부렉시컬환경참조 : {}
},
변수환경컴포넌트: {}
this바인딩컴포넌트 : {}
}
환경 레코드의 구성
환경레코드 : {
선언적환경레코드 : {},
오브젝트환경레코드: {}
}
- 선언적 환경 레코드와 오브젝트 환경 레코드로 나뉜다.
- 나뉜 이유는, 쓰임과 엔진의 처리가 다르기 때문이다.
선언적 환경 레코드(Declarative Environ)
- function, 변수, catch 문에 대해 실행 컨텍스트를 만들때는 환경을 선언적 환경 레코드에 저장한다.
- 지금까지 환경 레코드에 설정한다고 했는데, 모두 선언적 환경 레코드에 저장되는 것을 의미한다.
오브젝트 환경 레코드(Object Environment Record)
- 글로벌 오브젝트의, 글로벌 함수와 글로벌 변수 그리고 with문에 대해 실행컨텍스트를 만들 때, 오브젝트 환경 레코드에 저장한다.
- 이것들을 여기다가 저장하는 것들은 정적이 아니라 동적이다.
- 선언적 환경 레코드와 오브젝트 환경 레코드로 나눈 이유는, 동적인 것과 정적인 것의 엔진 동작 방식에 차이가 있기 때문이다.
글로벌 환경은 동적인것인가
글로벌 환경은 다음과 같이 생겼다.
실행컨텍스트 : {
글로벌환경 : {
환경레코드 : { 오브젝트환경레코드 : 글로벌 오브젝트 },
외부렉시컬환경참조 : null
}
}
- 글로벌 환경은 글로벌 오브젝트에서 사용한다.
- 렉시컬 환경 컴포넌트와 형태가 비슷하며, 엔진은 글로벌 환경을 렉시컬 환경과 동일하게 처리한다.
- 차이점이 있다면 글로벌 환경은 동적이라는 것이다.
- 동적으로 함수와 변수를 바인딩한다는 것이다.
- 함수에서 var 키워드를 사용하지 않고 변수를 선언하면 글로벌 오브젝트에 설정되어야 하기 때문에, 동적으로 환경이 변한다.
- 오브젝트 환경 레코드만 사용하면 된다.
- 글로벌 오브젝트는 오직 하나이기 때문에, 전역 변수와 전역 함수를 일일히 저장할 필요가 없어서 선언적 환경 레코드가 필요 없다.
- 글로벌 오브젝트는 어디에도 속하지 않으므로 외부 렉시컬 환경 참조값은 null이다.