2oneweek.dev

15. Enviromnet Record

    Tags

  • JavaScript
15. Enviromnet Record thumbnail

Enviromnet Record

실행컨텍스트 : { 렉시컬환경컴포넌트 : { 환경레코드 : {} 외부렉시컬환경참조 : {} }, 변수환경컴포넌트: {} this바인딩컴포넌트 : {} }

환경 레코드의 구성

환경레코드 : { 선언적환경레코드 : {}, 오브젝트환경레코드: {} }
  • 선언적 환경 레코드와 오브젝트 환경 레코드로 나뉜다.
    • 나뉜 이유는, 쓰임과 엔진의 처리가 다르기 때문이다.

선언적 환경 레코드(Declarative Environ)

  • function, 변수, catch 문에 대해 실행 컨텍스트를 만들때는 환경을 선언적 환경 레코드에 저장한다.
  • 지금까지 환경 레코드에 설정한다고 했는데, 모두 선언적 환경 레코드에 저장되는 것을 의미한다.

오브젝트 환경 레코드(Object Environment Record)

  • 글로벌 오브젝트의, 글로벌 함수와 글로벌 변수 그리고 with문에 대해 실행컨텍스트를 만들 때, 오브젝트 환경 레코드에 저장한다.
  • 이것들을 여기다가 저장하는 것들은 정적이 아니라 동적이다.
  • 선언적 환경 레코드와 오브젝트 환경 레코드로 나눈 이유는, 동적인 것과 정적인 것의 엔진 동작 방식에 차이가 있기 때문이다.



글로벌 환경은 동적인것인가

글로벌 환경은 다음과 같이 생겼다.

실행컨텍스트 : { 글로벌환경 : { 환경레코드 : { 오브젝트환경레코드 : 글로벌 오브젝트 }, 외부렉시컬환경참조 : null } }
  • 글로벌 환경은 글로벌 오브젝트에서 사용한다.
  • 렉시컬 환경 컴포넌트와 형태가 비슷하며, 엔진은 글로벌 환경을 렉시컬 환경과 동일하게 처리한다.
  • 차이점이 있다면 글로벌 환경은 동적이라는 것이다.
    • 동적으로 함수와 변수를 바인딩한다는 것이다.
    • 함수에서 var 키워드를 사용하지 않고 변수를 선언하면 글로벌 오브젝트에 설정되어야 하기 때문에, 동적으로 환경이 변한다.
  • 오브젝트 환경 레코드만 사용하면 된다.
    • 글로벌 오브젝트는 오직 하나이기 때문에, 전역 변수와 전역 함수를 일일히 저장할 필요가 없어서 선언적 환경 레코드가 필요 없다.
  • 글로벌 오브젝트는 어디에도 속하지 않으므로 외부 렉시컬 환경 참조값은 null이다.
Written by@2-one-week
현재 블로그 개발 중

GitHubLinkedIn