`globalThis`
Если вы писали 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
все еще полезен для полифиллов и других библиотек, которые требуют глобального доступа.