はじめに
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についてでした。
「ホスト環境によって違いがある」具体例として扱いました。
実際はより多くの差異・特徴があると思います。