Globálnà objekt poskytuje promÄnné a funkce, které jsou dostupné vÅ¡ude. StandardnÄ jsou to ty, které jsou vestavÄny do jazyka nebo prostÅedÃ.
V prohlÞeÄi se jmenuje window, v Node.js je to global, v jiných prostÅedÃch může mÃt jiný název.
Nedávno byl do jazyka pÅidán standardizovaný název globálnÃho objektu globalThis, který by mÄla podporovat vÅ¡echna prostÅedÃ. VÅ¡echny významné prohlÞeÄe jej podporujÃ.
Zde budeme použÃvat window, jelikož pÅedpokládáme, že naÅ¡Ãm prostÅedÃm je prohlÞeÄ. Pokud váš skript má bÄžet v jiných prostÅedÃch, je lepšà mÃsto nÄj použÃvat globalThis.
Ke vÅ¡em vlastnostem globálnÃho objektu lze pÅistupovat pÅÃmo:
alert("Ahoj");
// je totéž jako
window.alert("Ahoj");
V prohlÞeÄi se globálnà funkce a promÄnné deklarované pomocà var (ne let/const!) stávajà vlastnostmi globálnÃho objektu:
var gVar = 5;
alert(window.gVar); // 5 (stala se vlastnostà globálnÃho objektu)
Stejný efekt majà deklarace funkcà (pÅÃkazy s klÃÄovým slovem function v bÄhu hlavnÃho kódu, ne funkÄnà výrazy).
ProsÃme, nespoléhejte se na to! Toto chovánà existuje z důvodů kompatibility. Modernà skripty použÃvajà JavaScriptové moduly, v nichž se takové vÄci nedÄjÃ.
Kdybychom mÃsto toho použili let, toto by se nestalo:
let gLet = 5;
alert(window.gLet); // undefined (nestala se vlastnostà globálnÃho objektu)
Je-li hodnota tak důležitá, že byste ji chtÄli uÄinit globálnÄ dostupnou, uveÄte ji rovnou jako vlastnost:
// uÄinà informaci o aktuálnÃm uživateli globálnÃ, aby k nà mohly pÅistupovat vÅ¡echny skripty
window.aktuálnÃUživatel = {
jméno: "Jan"
};
// nÄkde jinde v kódu
alert(aktuálnÃUživatel.jméno); // Jan
// nebo, máme-li lokálnà promÄnnou s názvem âaktuálnÃUživatelâ,
// naÄteme ji pÅÃmo z objektu window (bezpeÄnÄ!)
alert(window.aktuálnÃUživatel.jméno); // Jan
TÃm chceme ÅÃci, že použÃvánà globálnÃch promÄnných se obecnÄ nedoporuÄuje. MÄlo by jich být co nejménÄ. Návrh kódu, v nÄmž funkce pÅijÃmá âvstupnÃâ promÄnné a produkuje urÄitý âvýstupâ, je ÄistÅ¡Ã, ménÄ náchylný k chybám a snadnÄjšà na otestovánÃ, než když funkce použÃvá vnÄjšà Äi globálnà promÄnné.
Využità pro polyfilly
Globálnà objekt použÃváme k testovánÃ, zda jsou podporovány modernà vlastnosti jazyka.
NapÅÃklad otestujeme, zda existuje vestavÄný objekt Promise (neexistuje v zastaralých prohlÞeÄÃch):
if (!window.Promise) {
alert("Máte zastaralý prohlÞeÄ!");
}
Pokud neexistuje (ÅeknÄme, že jsme ve starém prohlÞeÄi), můžeme vytvoÅit âpolyfillyâ: pÅidáme funkce, které toto prostÅedà nepodporuje, ale v modernÃm standardu existujÃ.
if (!window.Promise) {
window.Promise = ... // vlastnà implementace modernà vlastnosti jazyka
}
ShrnutÃ
-
Globálnà objekt obsahuje promÄnné, které by mÄly být dostupné odkudkoli.
PatÅà sem vestavÄné prvky JavaScriptu, napÅ.
Array, a promÄnné specifické pro urÄitá prostÅedÃ, napÅ.window.innerHeightâ výška okna v prohlÞeÄi. -
Globálnà objekt má univerzálnà název
globalThis.â¦ÄastÄji se na nÄj vÅ¡ak odkazujà názvy âze staré Å¡kolyâ specifické pro jednotlivá prostÅedÃ, napÅ.
window(prohlÞeÄ) neboglobal(Node.js). -
Do globálnÃho objektu bychom mÄli ukládat hodnoty jen tehdy, pokud jsou v naÅ¡em projektu doopravdy globálnÃ, a udržovat jejich poÄet na minimu.
-
V prohlÞeÄi, pokud nepoužÃváme moduly, se globálnà funkce a promÄnné deklarované pomocÃ
varstávajà vlastnostmi globálnÃho objektu. -
Aby náš kód zůstal do budoucna odolný a lépe srozumitelný, mÄli bychom pÅistupovat k vlastnostem globálnÃho objektu pÅÃmo, napÅ.
window.x.
KomentáÅe
<code>, pro nÄkolik Åádků je obalte znaÄkou<pre>, pro vÃce než 10 Åádků vložte odkaz na pÃskoviÅ¡tÄ (plnkr, jsbin, codepenâ¦)