TIL/Frontend

[JS] 전역 객체 globalThis - global, window, self...

쓱쓱565 2024. 1. 20. 17:11

1. 알게 된 점

  • 대규모 프로젝트에서 의사를 결정하는 과정
  • ECMAscript의 globalThis의 존재와 상세사항

2. 들어가며

  JS 의 전역 This는 런타임에 따라 다른 객체를 가리킨다. Node런타임에서는 this == global이고, 웹 브라우저 환경에서 This === window 를 가리킨다. SPA(Vue 혹은 Node)에서 this 는 현재의 Vue 또는 React 컴포넌트에 자동으로 bind 된다. Framework 를 활용해 개발 하다 보면 이 정도의 지식만으로도 충분했다.

 

  지난 시간 thisbind() 함수, Arrow function 에 대해 공부하다 globalThis 라는 스펙의 존재를 알게 되었다. globalThis는 JS의 모든 런타임에서 ‘전역 객체’에 접근할 수 있는 표준 방법이다. spec이 궁금하다면 아래의 MDN 문서를 살펴보자.

 

참고: globalThis - JavaScript | MDN

 

globalThis - JavaScript | MDN

전역 globalThis 속성에는 일반적으로 전역 객체와 유사한 전역 this 값이 포함됩니다.

developer.mozilla.org

 

 

3. ‘globalThis’ 의 탄생

  globalThis 라는 spec이 이러한 이름을 갖게 된 경위가 제법 흥미롭다. 비교적 최근(6년 전)부터 논의되었던 내용이라 그 과정을 잘 찾아볼 수 있다. 전문은 아래에서 볼 수 있다. 아래에 간단한 의역을 덧붙인다.

 

참고: 언어 제안서 - global


서문

strict mode 를 사용할 때, 환경에 관계 없이 전역 오브젝트에 접근할 수 있는 표준적인 방법은 Function의 eval 을 사용하는 방법밖에 없다. 대부분의 Javascript 개발자들이 평소 개발하며 전역 오브젝트에 접근할 일이 없긴 하지만, 여전히 이 스펙은 필요했다.

조건

이름을 선정하며 아래의 조건을 고려했다.

  1. ‘반드시’ 전역적으로 식별될 수 있어야 한다. 따라서 global에 먼저 접근하지 않고도 호출될 수 있어야 한다.
    1. 이 조건으로 인해 제외된 이름 후보들
      1. Symbol.global (or any other symbol)
      2. anything that isn't a valid identifier
  2. ‘반드시’ 전역적으로 식별될 수 있어야 한다. 구획(compartment)에 따라 분리될 수 있어야 한다. 두 개의 다른 ‘구획’은 각기 다른 두 개의 전역 객체를 제공해야 한다. 따라서 이 이름은 syntax를 통해 접근 가능한 객체의 속성이어서는 안 된다. 이름에 ‘영역’(realm) 이라는 단어가 포함되어서도 안 된다.
    1. 이 조건으로 인해 제외된 이름 후보들
      1. rootRealm
      2. currentRealm
      3. shadowRealm
      4. topGlobal
      5. rootGlobal
      6. globalRoot
  3. 어떠한 종교와도 연관성이 없어야 한다.
    1. 이 조건으로 인해 제외된 이름 후보들
      1. godObject
      2. globalGod

이하 생략


위의 조건에 따라 아래의 이름들이 살아남았다. 이름에 대한 설명을 덧붙인다.

  • globalThis
  • globals
  • globalInstance
  • globalValue
  • theGlobal: 정관사를 이름에 사용한 선례가 없음. 또한 영어가 모국어가 아닌 개발자들에게는 혼란을 줄 수 있는 이름임.
  • globalVars: 정확하지 않은 이름. 전역 변수에는 1) 함수 선언과 2) var 가 아닌 변수 선언이 포함될 수 있다.
  • __global__: __ 를 사용하는 패턴은 레거시 패턴이다. ES Module에서는 더 이상 사용하지 않을 것이다. Node.js 가 CommonJS 모듈들에서 __dirname__filename 을 사용하는 사례가 있긴 하다. Python은 빌트인 모듈을 구분하기 위해 __ 를 사용하곤 한다.

최종 선택: globalThis

web 호환성 문제로 global 이란 이름을 사용하지 못하게 된 후, 전역 객체를 가리키는 용어를 선별하였다. 그 내용은 아래와 같다.

  • global: 다른 이름들의 사용례와 비교하기 위해 선정.
  • globals: 작성자가 가장 마음에 들었던 내용.
  • globalThis: 잘 사용되지는 않지만, theGlobal 객체를 잘 나타내며 스펙에도 부합하는 이름임.
  • globalObject: 네이밍 조건에 부합하지 않았음. 그러나 개발자 커뮤니티에서는 일반적으로 사용하던 단어로, 이 이름을 사하는 것을 고려해보았음.

대화 끝에 globalThis 라는 이름으로 최종 결정되었다.


대화록1
대화록2