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

浏览器兼容性