はじめに
global object とは、簡単に言えば「コードのどこからでもアクセスできるオブジェクト」です。
ホスト環境(Node.jsや各種ブラウザなど)によって実装が変わります。
※コメントいただきました。
globalThisを使用すればホスト環境に関係なくglobal objectにアクセスできるようです。
ただし、挙動が変化することはないようです。Node.jsのglobalThisはglobalと同じ挙動をし、ブラウザのwindowもしくはglobalThisとは違う挙動をします。
ブラウザの場合:window
Chrome, Firefox, Safari, Edgeの各ブラウザはglobal objectとしてwindowを使用します。
See the Pen Qiita_global_window by Kohki_Takatama (@Kohki-Takatama) on CodePen.
※このボタンはブラウザのconsoleに情報を出力します。F12を押して、開発者ツールからconsoleを確認してください。
このデモは、以下の事項を示しています。
-
constを使用した変数宣言は、window.nameではアクセスできない -
varを使用した変数宣言は、window.nameでアクセスできる -
console.logとwindow.console.logは完全に等しい - 関数宣言
functionを使用した場合、window.name()でアクセスできる - 関数式の場合は、変数と同じく
constではアクセスできず、varならアクセスできる
なお、constで宣言した変数・関数もwindow.property = 変数 | 関数と明示すればアクセス可能(推奨はされない)
node.jsの場合:global
Node.js の場合は、各ファイルが独自のmoduleスコープを持っているようです。
global objectはファイルを超えてのアクセスが可能になるようです。
global.sayHello = function(name) {
console.log(`Hello, ${name}!`);
};
const moduleB = require('./moduleB');
moduleB.greetUser('Alice');
module.exports.greetUser = function(name) {
// グローバル関数を呼び出す
sayHello(name);
};
ブラウザのwindowと比較していきます。
変数・関数の挙動
var hoge = "hoge"
console.log(global.hoge) //undefined
const fuga = "fuga"
console.log(global.fuga) //undefined
ブラウザのwindowと違い、varでの宣言であってもglobal.nameでのアクセスができません。
global.property = variableと明示することでアクセス可能なのは、windowと同様です。
// 先程の続き
global.hoge = hoge
global.fuga = fuga
console.log(global.hoge) // "hoge"
console.log(global.fuga) // "fuga"
関数も同様です。
console.logとglobal.console.log
ブラウザのwindowと同様に、console.logとglobal.console.log は等しいです。
console.log("normal console") // "normal console"
global.console.log("global console") // "global console"
console.log(console.log === global.console.log) // true
おわりに
以上、global objectについてでした。
「ホスト環境によって違いがある」具体例として扱いました。
実際はより多くの差異・特徴があると思います。