Javascript 全局對象

2023-02-17 10:50 更新

全局對象提供可在任何地方使用的變量和函數(shù)。默認情況下,這些全局變量內(nèi)建于語言或環(huán)境中。

在瀏覽器中,它的名字是 “window”,對 Node.js 而言,它的名字是 “global”,其它環(huán)境可能用的是別的名字。

最近,globalThis 被作為全局對象的標(biāo)準(zhǔn)名稱加入到了 JavaScript 中,所有環(huán)境都應(yīng)該支持該名稱。所有主流瀏覽器都支持它。

假設(shè)我們的環(huán)境是瀏覽器,我們將在這兒使用 “window”。如果你的腳本可能會用來在其他環(huán)境中運行,則最好使用 globalThis

全局對象的所有屬性都可以被直接訪問:

alert("Hello");
// 等同于
window.alert("Hello");

在瀏覽器中,使用 var(而不是 let/const!)聲明的全局函數(shù)和變量會成為全局對象的屬性。

var gVar = 5;

alert(window.gVar); // 5(成為了全局對象的屬性)

函數(shù)聲明(特指在主代碼流中具有 function 關(guān)鍵字的語句,而不是函數(shù)表達式)也有這樣的效果。

請不要依賴它!這種行為是出于兼容性而存在的?,F(xiàn)代腳本使用 JavaScript modules 所以不會發(fā)生這種事情。

如果我們使用 let,就不會發(fā)生這種情況:

let gLet = 5;

alert(window.gLet); // undefined(不會成為全局對象的屬性)

如果一個值非常重要,以至于你想使它在全局范圍內(nèi)可用,那么可以直接將其作為屬性寫入:

// 將當(dāng)前用戶信息全局化,以允許所有腳本訪問它
window.currentUser = {
  name: "John"
};

// 代碼中的另一個位置
alert(currentUser.name);  // John

// 或者,如果我們有一個名為 "currentUser" 的局部變量
// 從 window 顯式地獲取它(這是安全的?。?alert(window.currentUser.name); // John

也就是說,一般不建議使用全局變量。全局變量應(yīng)盡可能的少。與使用外部變量或全局變量相比,函數(shù)獲取“輸入”變量并產(chǎn)生特定“輸出”的代碼設(shè)計更加清晰,不易出錯且更易于測試。

使用 polyfills

我們使用全局對象來測試對現(xiàn)代語言功能的支持。

例如,測試是否存在內(nèi)建的 ?Promise? 對象(在版本特別舊的瀏覽器中不存在):

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

如果沒有(例如,我們使用的是舊版瀏覽器),那么我們可以創(chuàng)建 “polyfills”:添加環(huán)境不支持但在現(xiàn)代標(biāo)準(zhǔn)中存在的功能。

if (!window.Promise) {
  window.Promise = ... // 定制實現(xiàn)現(xiàn)代語言功能
}

總結(jié)

  • 全局對象包含應(yīng)該在任何位置都可見的變量。
  • 其中包括 JavaScript 的內(nèi)建方法,例如 “Array” 和環(huán)境特定(environment-specific)的值,例如 window.innerHeight — 瀏覽器中的窗口高度。

  • 全局對象有一個通用名稱 globalThis。
  • ……但是更常見的是使用“老式”的環(huán)境特定(environment-specific)的名字,例如 window(瀏覽器)和 global(Node.js)。

  • 僅當(dāng)值對于我們的項目而言確實是全局的時候,才應(yīng)將其存儲在全局對象中。并保持其數(shù)量最少。
  • 在瀏覽器中,除非我們使用 modules,否則使用 ?var? 聲明的全局函數(shù)和變量會成為全局對象的屬性。
  • 為了使我們的代碼面向未來并更易于理解,我們應(yīng)該使用直接的方式訪問全局對象的屬性,如 ?window.x?。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號