このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。

View in English Always switch to English

globalThis

Baseline 広く利用可能

この機能は広く実装されており、多くのバージョンの端末やブラウザーで動作します。2020年1月以降、すべてのブラウザーで利用可能です。

globalThis はグローバルプロパティで、グローバルオブジェクトと同等であるグローバルな thisが格納されています。

試してみましょう

function canMakeHTTPRequest() {
  return typeof globalThis.XMLHttpRequest === "function";
}

console.log(canMakeHTTPRequest());
// Expected output (in a browser): true

グローバルの this オブジェクトです。

globalThis のプロパティ属性
書込可能
列挙可能不可
設定可能

メモ: globalThis プロパティは構成可能で書き込み可能なので、コードの作成者は、信頼できないコードを実行する際にこのプロパティを非公開にして、グローバルオブジェクトが公開されるのを防ぐことができます。

解説

従来、グローバルスコープにアクセスするには、JavaScript 環境ごとに異なる構文を必要としていました。ウェブ上では window, self, frames を使うことができます。しかし Web Workerself のみを利用することができます。Node.js はこれらのいずれも利用できず、代わりに global を使用する必要があります。 this キーワードは、厳格でないモードで実行されている関数の中で使用することもできますが、厳格モードで実行されているモジュールや関数の中では undefined になります。Function('return this')() を使用することもできますが、CSP などによって eval() を無効にしている環境では、この方法でも Function の使用が抑制されます。

globalThis プロパティは、環境を越えてグローバルな this 値 (すなわちグローバルオブジェクト自身) にアクセスするための標準的な方法を提供します。windowself などの同様のプロパティとは異なり、これはウィンドウのコンテキストでも非ウィンドウのコンテキストでも動作することが保証されています。この方法では、コードがどの環境で実行されているのかを知らなくても、一貫した方法でグローバルオブジェクトにアクセスすることができます。名前を覚えやすくするために、グローバルスコープでは this の値は globalThis であることを忘れないでください。

メモ: globalThis は、通常、グローバルオブジェクトと同じ概念です(つまり、globalThis にプロパティを追加すると、それらはグローバル変数になります)。これは、ブラウザーや Node の場合ですが、ホストは、グローバルオブジェクトとは無関係の別の値を globalThis に指定することができます。

HTML と WindowProxy

多くのエンジンでは globalThis は実在のグローバルオブジェクトの参照になりますが、ウェブブラウザーにおいては、iframe およびウィンドウ間のセキュリティ上の配慮から、これは(直接アクセスできない)実在のグローバルオブジェクトに関する Proxy になります。一般的な利用に関わることは稀ですが、認識しておくことは重要です。

命名

selfglobal のような他の一般的な名前の選択肢は、既存のコードとの互換性を損なう可能性があるため、候補から除外されました。詳しくは language proposal's "naming" document を参照してください。

globalThis は、文字通り、グローバルな this 値です。これは、オブジェクトを指定せずに呼び出された厳格モードではない関数内の this 値と同じ値です。また、スクリプトのグローバルスコープにおける this の値でもあります。

異なる環境間でグローバルの検索

通常、グローバルオブジェクトを明示的に指定する必要はありません。そのプロパティは、グローバル変数として自動的にアクセスできます。

js
console.log(window.Math === Math); // true

ただし、グローバルオブジェクトに明示的にアクセスする必要がある場合が 1 つあります。それは、通常 ポリフィル の目的で、グローバルオブジェクトに書き込みを行う場合です。

globalThis の導入前、環境全体のグローバルオブジェクトを取得する唯一の信頼できるクロスプラットフォームな方法は Function('return this')() でした。しかし、これは一部の設定で CSP 違反を発生させるため、作成者は次のような区分定義を使用することになります(オリジナルの core-js のソースを若干変更)。

js
function check(it) {
  // Math はあらゆる環境にグローバルに存在することが知られている
  return it && it.Math === Math && it;
}

const globalObject =
  check(typeof window === "object" && window) ||
  check(typeof self === "object" && self) ||
  check(typeof global === "object" && global) ||
  // 厳格モードで実行すると、これは undefined を返す
  (function () {
    return this;
  })() ||
  Function("return this")();

グローバルオブジェクトを取得した後、そのオブジェクトに新しいグローバルを定義することができます。例えば、Intl の実装を追加する場合です。

js
if (typeof globalObject.Intl === "undefined") {
  // No Intl in this environment; define our own on the global scope
  Object.defineProperty(globalObject, "Intl", {
    value: {
      // Our Intl implementation
    },
    enumerable: false,
    configurable: true,
    writable: true,
  });
}

globalThis が利用可能になったため、異なる環境間でグローバルを追加で検索する必要がなくなりました。

js
if (typeof globalThis.Intl === "undefined") {
  Object.defineProperty(globalThis, "Intl", {
    value: {
      // 独自の Intl 実装
    },
    enumerable: false,
    configurable: true,
    writable: true,
  });
}

仕様書

仕様書
ECMAScript® 2027 Language Specification
# sec-globalthis

ブラウザーの互換性

関連情報