Экосистемы, в которых работает 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();