Перейти к основному содержимому

`globalThis`

· 2 мин. чтения
Mathias Bynens ([@mathias](https://twitter.com/mathias))

Если вы писали JavaScript для использования в веб-браузере, возможно, вы использовали window для доступа к глобальному объекту this. В Node.js вы могли использовать global. Если вы писали код, который должен работать в обеих средах, вы могли определить, какой из них доступен, и затем использовать его — но список идентификаторов, которые нужно проверять, растет с увеличением числа окружений и случаев использования. Это быстро выходит из-под контроля:

// Наивная попытка получения глобального объекта `this`. Не используйте это!
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('Невозможно найти глобальный объект `this`');
};
const theGlobalThis = getGlobalThis();

Для получения более подробной информации о том, почему вышеописанный подход недостаточен (а также о ещё более сложной технике), прочитайте ужасный полифилл globalThis в универсальном JavaScript.

Предложение globalThis вводит унифицированный механизм для доступа к глобальному this в любой среде JavaScript (браузер, Node.js или что-то иное), независимо от цели сценария (классический сценарий или модуль?).

const theGlobalThis = globalThis;

Заметьте, что современный код может совсем не нуждаться в доступе к глобальному this. С помощью модулей JavaScript вы можете декларативно import и export функциональность вместо работы с глобальным состоянием. globalThis все еще полезен для полифиллов и других библиотек, которые требуют глобального доступа.

Поддержка globalThis