자바스크립트에서 코드가 실행 되기 전 단계(런타임 이전)에서 JS 엔진에 의해 의해 어떤 객체보다도 먼저 생성되는 객체를 전역 객체라고 하는데요. 계층적 구조상 어떠한 객체에도 속하지 않는 최상위 객체를 의미하며, 앞서 살펴본 표준 빌트인 객체 또한 전역 객체 중 하나입니다.
이 외에 호스트 객체, var 키워로 선언한 전역 변수 및 함수, 프로퍼티 등(전역 객체라기 보다는 전역 요소에 해당)을 의미합니다.
이때 var 키워드로 선언된 전역 변수 및 식별자는 단독으로 사용된 변수에 대한 암묵적 전역 및 전역 함수는 전역 객체의 프로퍼티로 취급됩니다.
이러한 전역 객체는 자바스크립트가 실행 되는 환경마다 다른데, 윈도우 환경에서는 window 혹은 this, Node.js 환경에서는 global을 전역 객체로 사용하며, ES11에서 도입된 globalThis 객체는 환경 마다 다르던 전역 객체를 통일하여 사용되는 역할을 하며, 이 globalThis 전역 객체는 ESMAScript의 표준 사양을 준수하는 실행 환경이라면 제약없이 사용이 가능합니다.
① 윈도우 환경 및 노드 환경에서의 전역 객체) globalThis === this; // this 키워드는 윈도우 및 노드 환경에서 공통된 전역 객체입니다. globalThis === window; // window 객체는 윈도우 실행 환경에서의 전역 객체를 가리키는 식별자 입니다. globalThis === global; // global 객체는 노드 실행 환경에서의 전역 객체를 가리키는 식별자 입니다. ② 전역 객체의 프로퍼티로 취급 되는 상황들) var name = "Re_Go"; // var로 선언된 변수는 console.log(window.name); // 해당 환경에서의 전역 객체의 프로퍼티가 되며, 여기서 var은 전역 객체(window)의 프로퍼티로 취급 되더라고 엄연한 변수이기 때문에 delete로 삭제가 불가능합니다. y = 10; // 키워드 없이 선언된 변수는 자바스크립트 엔진에 의해 window.y로 해석하여 마치 전역 변수인 듯 취급되는 현상인 암묵적 전역 현상에 의해 console.log(window.y); // 해당 환경에서의 전역 객체의 프로퍼티가 됩니다. 단 y는 변수가 아니므로 변수 호이스팅이 발생되지 않으며, delete 연산자는 객체 내의 프로퍼티를 삭제하는대에 사용되기 때문에 키워드가 없는 식별자는 전역 변수로 취급되더라도, 삭제시에는 객체의 프로퍼티로 취급 되므로 delete로 삭제가 가능합니다.
이러한 전역 객체는 다음과 같은 특징을 가지고 있습니다.
- 자바스크립트에서는 개발자에게 의도적으로 전역 객체를 생성할 수 있는 생성자 함수를 제공되지 않습니다. 즉 이 말은 개발자가 var 키워드로 변수나 함수를 전역 요소로 생성하려 한다고 해도 자바스크립트 엔진에 의해서 전역 요소로 취급되는 것이지, 개발자가 직접적으로 전역 요소로 해당 요소들을 생성하는 방법은 아니라는 것입니다.
// ① var로 선언된 변수의 소속 예시 var globalVar = "I am a global variable"; console.log(global.globalVar); // "I am a global variable" 출력 > >
- 전역 객체의 프로퍼티를 참조할 시 전역 객체 식별자(window 혹은 global)을 생략할 수 있다. 즉 각각의 전역 객체 키워드를 제외하고 표준 빌트인 객체들의 메서드 및 프로퍼티를 단독으로 사용하는것이 가능하다는 설명입니다.
window.parseInt('F', 16); // 문자 F를 16진수로 해석하여 10진수로 반환하는 parseInt 메서드 등, 기본적으로 제공 되는 표준 빌트인 객체들의 메서드와 프로퍼티들을 갖고 있으므로 > parseInt('F', 16); // 다음 문구처럼 해당 메서드 및 프로퍼티를 참조시 식별자 생략이 가능합니다.
전역 객체는 주로 전역 변수 및 함수를 저장하는 저장소로서의 역할을 수행하는데요. 하지만 이러한 전역 객체가 활약을 하는 순간은 전역 속성으로서 호출되는 빌트인 객체를 사용할 때가 아닐까 싶은데, 대표적으로 Math, Date, RegExp 빌트인 객체가 있습니다.
그러나 이들을 사용할 때에는 굳이 환경 마다 전역 객체를 명시하고 사용하지 않아도 되기에 사실상 개념 정도만 알아두시면 됩니다.
// ① 전역 객체의 명시 없이도 사용 가능한 빌트인 객체는 사실상 단독으로 쓰여도 무방합니다. // 빌트인 객체 단독으로 사용 const num = 16; const squareRoot = Math.sqrt(num); console.log(squareRoot); // 4 // global 키워드를 명시하여 Math 빌트인 객체(메서드)를 호출. const anotherSquareRoot = global.Math.sqrt(num); console.log(anotherSquareRoot); // 4
전역 프로퍼티는 그 수가 많아 앞서 말씀드린대로 기본적으로 제공 되는 각 빌트인 객체들의 프로퍼티라고 보시면 되는데, 속성 프로퍼티만 따지면 Infinity, NaN, undefined가 있으며 null은 유일하게 전역 객체의 프로퍼티가 아닙니다.
또한 앞서 언급한대로, 전역 변수로서가 아닌 암묵적 전역 현상(키워드 없이 선언되고 초기화 된 식별자)에 의해 전역 변수 취급되는 프로퍼티는 delete 키워드로 삭제가 가능하나, 그 이외에 전역 변수(var 등의 경우)는 delete 연산자로 삭제가 불가능합니다.
더불어서 빌트인 전역 함수는 eval, isFinite, isNaN, isUndefined 등이 있으며, 특히 eval은 여러 이슈로 사용이 금기시 되고 있습니다.
// ① 전역 속성 프로퍼티 예시 console.log(global.Infinity); // Infinity 출력 console.log(global.undefined); // undefined 출력 console.log(global.NaN); // NaN 출력 console.log(global.null); // 찾을 수 없는 속성이므로 undefined 출력 // ② 암묵적 전역 변수와 명시적 전역 변수를 delete로 삭제시키는 예시 implicitGlobalVariable = "I am an implicit global variable"; var explicitGlobalVariable = "I am an explicit global variable"; // delete 키워드로 삭제 delete implicitGlobalVariable; // 암묵적 전역 변수 삭제 시도 delete explicitGlobalVariable; // 명시적 전역 변수 삭제 시도 console.log(implicitGlobalVariable); // 출력: undefined console.log(explicitGlobalVariable); // 출력: "I am an explicit global variable"