Экосистемы, в которых работает JavaScript, значительно расширились. Начиная с браузеров, теперь он распространился на серверы, умные часы и даже в области искусственного интеллекта или машинного обучения.

Для доступа к глобальному объекту в каждой среде JavaScript имеет свою собственную объектную модель и предоставляет другой синтаксис.

Например, в браузере вы можете получить доступ к глобальному объекту, используя эти ключевые слова window, self или frames.

console.log(window);    
// Window {...}

Тогда в среде Node.js эти ключевые слова - window, self или frames - не будут работать. Доступ к ним в среде Node.js вызовет ошибку - ReferenceError: window is not defined. Итак, для доступа к глобальному объекту нам понадобится globlal.

console.log(global);    
// Object [global] {...}

Что касается веб-воркеров, единственный доступный глобальный объект - это self, который возвращает DedicatedWorkerGlobalScope.

console.log(self);    
// DedicatedWorkerGlobalScope {...}

Эти разные способы ссылки на глобальный объект в разных средах затрудняют написание переносимого кода JavaScript, который работает в нескольких или во всех средах.

Чтобы решить эту проблему, используйте стандартное имя свойства globalThis, которое доступно во всех средах.

// In browser
console.log(globalThis); // window
// In node.js
console.log(globalThis); // Object[global]{...}
// Web Worker
console.log(globalThis); // DedicatedWorkerGlobalScope {...}

Матиас Биненс создал полифил, который безупречно работает для любой среды, которая выглядит следующим образом:

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('Unable to locate globalThis');
};
var globalThis = getGlobalThis();

Совместимость с браузером globalThis