为什么要写window.?

Why do we write window.?

在向网页添加一些初始化代码时,我发现自己写了无数次 window.onload = ...,当我突然想到时。

不需要window.,因为window是当前对象。所以它是可选的!
但是没有人只写 onload = ...,我想知道为什么会这样。

我的意思是,我们对写其他东西没有任何疑虑,比如没有 window. 限定词的 alert

window.onload = function() {
  alert('Your window has loaded');
};

而实际上,alertonload 一样都是 window 对象的方法。
那么,为什么不同?为什么像 W3C 这样的正规网站也这样做?

我看到以下原因:

  1. 减少向上搜索 scope-chain略微提高性能。这在 IIFE 中也可以看到,其中 window 作为参数发送给函数,并在其中使用对 window 的本地引用。
  2. 如果在 window 上全局定义的 function/member 在范围内被覆盖,那么它将不会按预期工作,因此显式引用使其引用正确的 function/member。这对于创建与全局成员同名的 function/member 并且仍然能够从阴影范围访问全局成员很有用。

因为 .onload 并非 window 独有。它也可以用作,例如 document.onload。因此,您可以根据希望何时执行脚本来定义它。

window 对象默认由浏览器初始化。这是一个很好的 练习显式定义 window 对性能有影响的对象,您的代码将变得易于理解。

当我们想明确说明时,我们写 window.。基本上有两种情况可以很好地使用它:

  • window 对象的属性和方法 - Window interface 的所有内容。您提到的 .onload 侦听器就是一个例子,例如 window.scrollYwindow.statuswindow.parentwindow.open()window.focus()window.removeEventListener() 是其他人。
  • 创建全局属性。从任何范围分配给 window.myGlobalVar 是创建全局 "variable" 的常见 JS 习惯用法。不可否认,用 var.
  • 显式声明它仍然是更好的做法

虽然我们可以 "optionally" 省略此处的 window. 部分,但这并不常见。特别是通过赋值创建 implicitly global variables 被鄙视,通常被视为错误。因此,如果您是故意这样做的,则可以使用 window..

来声明您的意图

但是,第一种情况并不总是定义明确。当我们要使用的 属性 本质上是一个静态的全局变量,并且不一定与 window 对象相关时,我们通常会省略 window. 部分,即使它已被正式指定.你很少看到有人使用带有 window. 前缀的 documentatob()WorkersetTimeout()fetch(),就像你不使用window.JSON.parsewindow.Array 用于 内置对象 (尽管它是有效的)。

对于其他一些属性,如 navigatorlocationalert(),它并不总是很清楚,无论是否使用这些属性可能有 550 个。