Window:window 屬性

Baseline 已廣泛支援

此特性已相當成熟,可在許多裝置和瀏覽器版本上使用。自 ⁨2015 年 7 月⁩以來,各瀏覽器均已提供此特性。

Window 物件上的 window 屬性指向視窗物件本身。

因此,以下表達式都返回同一個視窗物件

js
window.window;
window.window.window;
window.window.window.window;
// …

在網頁中,window 物件也是一個全域性物件。這意味著

  1. 你的指令碼的全域性變數實際上是 window 的屬性

    js
    var global = { data: 0 };
    alert(global === window.global); // displays "true"
    
  2. 你可以訪問 window 物件的內建屬性,而無需在前面加上 window.

    js
    setTimeout(() => alert("Hi!"), 50); // equivalent to using window.setTimeout() and window.alert().
    alert(window === window.window); // displays "true"
    

window 屬性指向物件本身的目的是,很可能是為了方便引用全域性物件。否則,你不得不在指令碼頂部手動進行 let window = this; 賦值。

另一個原因在於,如果沒有此屬性,你就無法編寫例如 window.open('https://google.com/') 這樣的程式碼。你將不得不改為使用 open('https://google.com/')

使用此屬性還有另一個原因,那就是庫希望提供面向物件版本和非面向物件版本(特別是 JavaScript 模組)。例如,如果我們引用“this.window.location.href”,一個 JavaScript 模組可以在其定義的類中定義一個名為“window”的屬性(因為預設情況下不存在全域性“window”變數),該屬性可以在將視窗物件傳遞給模組類的建構函式後建立。因此,在其函式中的“this.window”將指向該視窗物件。在非名稱空間版本中,“this.window”將指向“window”並能夠輕鬆獲取文件位置。另一個優點是, such a class 的物件(即使該類是在模組外部定義的)可以隨時更改其對視窗的引用,而如果它們硬編碼了對“window”的引用,則無法做到這一點。類中的預設值仍然可以設定為當前視窗物件。

規範

規範
HTML
# dom-window-dev

瀏覽器相容性