Execution Context [8] - Host Object & Global Scope

Marullo·2021년 4월 9일
0
post-thumbnail

Host Object

Host Object와 Native Object의 차이

Host Object는 환경에서 제공해준다. 따라서 Host Object는 항상 동일한 것이 아니며, 환경마다 다르다. 브라우저 환경에서 제공하는 Host Object는 window이며, Node환경에서 제공하는 Host Object는 NodeList다.
Native Object 혹은 Built-in Object라고 하는 것은 JS에서 제공하는 Object다. Native Object는 String(), Number()와 같이 생성자를 가진다.


JS는 Host Object를 Global Object로 사용한다.

따라서 브라우저에 사용되는 JS에서 함수에 속하지 않은 영역에서 this는 window이며,
Node에서는 nodelist가 출력된다.



Global Object

Global Object?? Global Scope??

Global Object는 Global Scope에 존재하는 Object를 말한다.
여기서 Global Object와 Global Scope에 대해 혼동을 할 수 있는데,
Global Object와 Global Scope는 동일한 객체다.

그러나 바라보는 주체가 다르다.
최상단에 위치한 하나의 객체에 대해 개발자는 Global Object라는 객체 관점에서 바라보고,
JS Engine은 Global Scope라는 Scope 개념으로 바라보는 것이다.

이전에 포스팅 했듯이 Scope는 추상적인 개념이다.
JS Engine은 IR(식별자 해결)을 위해 Global Object를 Scope로 바라보는 것이다.


Global Object 특징

  • JS에서는 항상 Global Object가 정의된다.
  • 전역에 정의된 변수나 함수는 Global Object의 멤버로서 존재하게 된다.
  • JS 소스파일 전체에서 Global Object는 하나만 존재한다.
    소스파일 전체라는 것은 <script>태그 안에 작성되거나 로드된 모든 JS 코드를 말한다. 파일이 달라도 모두 하나의 Global Object에 속하게 된다.

Global Context - Dynamic Env

지금까지 Execution Context는 정적 환경을 갖는다고 설명을 해왔다.
보통 Engine은 Scope를 결정할 때(EC를 초기화할 때) 변수나 함수를 Execution Context > Lexcial Env > 환경 레코드 > 선언적 환경 레코드 안에 k/v 형태로 저장하여 쓴다.

그러나 Global Context는 동적 환경을 갖는다.
Global Context는 Execution Context > Lexcial Env > 환경 레코드 > 오브젝트 환경 레코드처럼 전역변수와 전역함수를 오브젝트 환경 레코드에 k/v 형태로 저장한다.
즉 Global Scope에서는 IR(식별자 해결)을 오브젝트 환경 레코드에서 진행한다.

왜 동적환경을 갖는가?

let globalVar = 100

function setGlobal(){
  alsoGlobal = 1000
  let notGlobal = 200
}
setGlobal()

위의 코드를 살펴보자.
JS Engine이 Global Context의 선언문을 처리할 때, Scope에 설정되는 것은 {setGlobal : Function Object} 뿐이다.
JS Engine이 표현식을 처리할 때, Scope에는 {globalVar : undefined}이 추가로 설정된다.
이후 코드가 실행되면서 {globalVar : 100}이 설정되고 setGlobal 호출문에 의해 setGlobal의 Context로 엔진 컨트롤이 이동해야한다.

그런데 setGlobal의 Scope에서 alsoGlobal이라는 전역변수를 설정했다.
이처럼 JS Engine은 전역변수가 언제 등장할지 모르기 때문에, Global Scope를 정적환경으로 쓸 수 없고 동적환경을 써야 한다. JS Engine 또한 정적환경과 동적환경을 따로 처리하기 위해, 정적환경은 선언적 환경 레코드에 설정하고 동적환경은 오브젝트 환경 레코드에 설정한다.



ref

https://rlynjb.medium.com/js-interview-question-what-s-the-difference-between-host-objects-and-native-objects-b395f7c5fbf1
https://developer.mozilla.org/en-US/docs/Glossary/Global_object

profile
한국외대 중국어&컴공 복수전공 - 세미 전공자의 기술 블로그

0개의 댓글