筆者注意到JS中的
window
對象與global
對象經常被混淆,盡管它們在相當一部分使用情況下可以等同,但是本質上仍然存在很多不同,下面是對于兩者的詳細拆解
1. window
對象
- 定義:
window
對象表示 瀏覽器環境中的全局上下文。 - 作用域:它是瀏覽器中運行的任何 JavaScript 代碼的頂級對象。
- 關鍵特性:
- 包含所有通過
var
聲明的 全局變量和函數(在非模塊腳本中)。 - 表示瀏覽器的 窗口 或 框架,代碼運行在其中。
- 包含瀏覽器特定的屬性和方法,如:
window.location
(當前 URL)window.document
(頁面的 DOM 樹)window.alert()
(彈出框)
- 隱式引用/自動掛載:通過
var
聲明或未使用let
/const
/var
創建的全局變量成為window
的屬性。
- 包含所有通過
示例:
console.log(window.location.href); // 打印當前頁面的 URL
window.alert("Hello!"); // 顯示一個警告對話框
2. global
對象
- 定義:
global
對象是所有 JavaScript 環境中(瀏覽器、Node.js 或其他)可用的頂級對象。 - 作用域:它作為容器,包含所有全局可訪問的實體。
- 關鍵特性:
- 它根據 執行環境 的不同而有所不同:
- 在瀏覽器中,
global
對象是window
。 - 在 Node.js 中,
global
對象是global
。 - 在 Web Workers 中,
global
對象是self
。
- 在瀏覽器中,
- 包含全局內置對象,如
Math
、Date
、JSON
等。
- 它根據 執行環境 的不同而有所不同:
Node.js 示例:
console.log(global.setTimeout); // 通過 global 訪問 setTimeout
瀏覽器示例:
console.log(window === global); // 在瀏覽器中為 true
3. 關鍵區別
方面 | window 對象 | global 對象 |
---|---|---|
作用域 | 僅限于瀏覽器 | 通用(瀏覽器、Node.js 等) |
環境 | 僅在瀏覽器中可用 | 取決于環境(window 、global 或 self ) |
內容 | 包含瀏覽器特定的 API 和方法 | 包含標準的全局對象(Math 、JSON 等) |
全局變量 | 作為 window 的屬性可訪問 | 作為全局對象的屬性可訪問 |
Node.js 支持 | 不可用 | 使用 global 代替 |
4. 使用 globalThis
實現通用訪問
- ES2020 引入了
globalThis
,提供了一種不依賴于環境的通用方式來訪問全局對象:- 在瀏覽器中,
globalThis
等同于window
。 - 在 Node.js 中,
globalThis
等同于global
。 - 在 Web Workers 中,
globalThis
等同于self
。
- 在瀏覽器中,
示例:
// 在不同環境中都有效
console.log(globalThis.setTimeout === setTimeout); // true
5. 重疊與差異
重疊
在瀏覽器中:
var x = 10; // 聲明一個全局變量
console.log(window.x); // 10(與 global.x 相同)
差異
// Node.js 示例
global.x = 10; // 在 global 中可用
console.log(global.x); // 10
console.log(window.x); // 錯誤:window 未定義
結論
- 當處理與瀏覽器相關的功能(如 DOM 操作、位置、警告等)時,使用
window
對象。 - 使用 全局對象(或
globalThis
以確保跨環境兼容性)編寫與環境無關的代碼。