ES10 globalThis scope

ES10 released the globalThis property to enable global this context maps to the global object. It provides a unique way of giving access to global objects like windows.

As you know javascript has the support for multiple environments like client, server-side or with IoT or mobiles, Client environment like browser has to use window or self or frames(for web or service workers). These (window, self, or frames) will not work on the server side like the nodejs platform. To handle this, we have to write the custom code to have unique global access for each environment.

 const globalThis=(){
 if (clientside){//return clientGlobalObject}
 if (serverside){//return serverGlobalObject}
  if (mobile){//return mobileGlobalObject}
   if (IOT){//return iotGlobalObject}
}

It will not work when a new environment comes as you have to again write separate conditions to handle this. To make it unique of accessing global objects in multiple environments,globalThis is introduced to get global context on any environment.

Alternatives to globalThis in Browser

In a client-side application like browsers, windows and frames are global objects so globalThis is the same as window and frames=globalThis selfs is equal to globalThis in web or services workers as window and frames are undefined in this.

Alternative in Nodejs There is no window or self or frames in the nodejs environment. global is available and equal to globalthis.

Syntax

globalThis.[variable]= data

An example for accessing global this scope data

function setGlobalData() {
    globalThis.mydata ='testthis';
}
setGlobalData();
console.log(globalThis.mydata ); //outputs testthis

we can save data to global this scope like object assignment, retrieve this with globalThis with accessor.

polyfill to support all platforms

This is ES10 features, To support older browsers, the following is the code to handle fallback cases.

const getGlobalThis = () => {
  if (typeof globalThis !== 'undefined') return globalThis;
  if (typeof self !== 'undefined') return self;
  if (typeof window !== 'undefined') return window;
  if (typeof global !== 'undefined') return global;
  if (typeof this !== 'undefined') return this;
  throw new Error('Could not find global this `this`');
};
var globalThisScopeObject = getGlobalThis();

Babel Syntax support.

@babel/preset-env is the plugin used to use the latest features without worrying about the latest changes Configure babel plugin in nodejs projects using npm or yarn

npm install --save-dev @babel/preset-env
yarn add @babel/preset-env --dev

.babelrc

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "useBuiltIns": "usage"
      }
    ]
  ]
}

Supported versions

This feature is supported in the following JavaScript engines and browsers as per V8

  • V8 6.6
  • Node12+
  • Chrome 71+
  • Firefox 65+
  • Opera 53+
  • Safari 12.1+