Globální objekt

Globální objekt poskytuje proměnné a funkce, které jsou dostupné kdekoli. Ve výchozím nastavení jsou to ty, které jsou zabudovány do jazyka nebo prostředí.

V prohlížeči má název window , pro Node.js je to global , pro jiná prostředí může mít jiný název.

Nedávno globalThis byl přidán do jazyka jako standardizovaný název pro globální objekt, který by měl být podporován ve všech prostředích. Je podporován ve všech hlavních prohlížečích.

Použijeme window zde za předpokladu, že naším prostředím je prohlížeč. Pokud váš skript může běžet v jiných prostředích, je lepší použít globalThis místo toho.

Všechny vlastnosti globálního objektu jsou přístupné přímo:

alert("Hello");
// is the same as
window.alert("Hello");

V prohlížeči jsou globální funkce a proměnné deklarovány pomocí var (nikoli let/const !) se stanou majetkem globálního objektu:

var gVar = 5;

alert(window.gVar); // 5 (became a property of the global object)

Deklarace funkcí mají stejný účinek (příkazy s function klíčové slovo v toku hlavního kódu, nikoli funkční výrazy).

Na to prosím nespoléhejte! Toto chování existuje z důvodů kompatibility. Moderní skripty používají moduly JavaScriptu tam, kde se něco takového neděje.

Pokud bychom použili let místo toho by se taková věc nestala:

let gLet = 5;

alert(window.gLet); // undefined (doesn't become a property of the global object)

Pokud je hodnota tak důležitá, že byste ji chtěli zpřístupnit globálně, napište ji přímo jako vlastnost:

// make current user information global, to let all scripts access it
window.currentUser = {
 name: "John"
};

// somewhere else in code
alert(currentUser.name); // John

// or, if we have a local variable with the name "currentUser"
// get it from window explicitly (safe!)
alert(window.currentUser.name); // John

To znamená, že použití globálních proměnných se obecně nedoporučuje. Globálních proměnných by mělo být co nejméně. Návrh kódu, kde funkce získává „vstupní“ proměnné a vytváří určitý „výsledek“, je jasnější, méně náchylný k chybám a snáze se testuje, než když používá vnější nebo globální proměnné.

Použití pro polyfilly

Globální objekt používáme k testování podpory funkcí moderního jazyka.

Otestujte například, zda je vestavěný Promise objekt existuje (ve skutečně starých prohlížečích ne):

if (!window.Promise) {
 alert("Your browser is really old!");
}

Pokud žádný neexistuje (řekněme, že jsme ve starém prohlížeči), můžeme vytvořit „polyfilly“:přidat funkce, které nejsou podporovány prostředím, ale existují v moderním standardu.

if (!window.Promise) {
 window.Promise = ... // custom implementation of the modern language feature
}

Shrnutí

  • Globální objekt obsahuje proměnné, které by měly být dostupné všude.

    To zahrnuje vestavěné prvky JavaScriptu, například Array a hodnoty specifické pro prostředí, jako je window.innerHeight – výška okna v prohlížeči.

  • Globální objekt má univerzální název globalThis .

    …Ale častěji se na něj odkazují „staré“ názvy specifické pro prostředí, jako je window (prohlížeč) a global (Node.js).

  • Hodnoty bychom měli ukládat do globálního objektu pouze v případě, že jsou pro náš projekt skutečně globální. A udržet jejich počet na minimu.

  • V prohlížeči, pokud nepoužíváme moduly, globální funkce a proměnné deklarované pomocí var se stanou vlastností globálního objektu.

  • Aby byl náš kód odolný vůči budoucnosti a byl srozumitelnější, měli bychom přistupovat k vlastnostem globálního objektu přímo, jako window.x .