我们为什么要写窗口

Why do we write window.?

本文关键字:窗口 为什么 我们      更新时间:2023-09-26

在向网页添加一些初始化代码时,我发现自己在写window.onload = ...,这时一个想法突然袭击了我。

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

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

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

而实际上,alert就像onload一样是window对象的方法。
那么,为什么会有差异呢?为什么像W3C这样的正式网站也要这样做?

当我们想要明确说明它时,我们会写window.。基本上有两种情况,这是使用它的好形式:

  • window对象的属性和方法 - 属于Window接口的所有内容。你提到的.onload侦听器就是一个例子,比如window.scrollYwindow.statuswindow.parentwindow.open()window.focus()window.removeEventListener()等。
  • 创建全局属性。从任何范围分配给window.myGlobalVar是创建全局"变量"的常见 JS 习惯用法。诚然,用var明确声明它还是更好的做法。

虽然我们可以在这里"选择性地"省略window.部分,但这并不常见。特别是通过赋值创建隐式全局变量是被鄙视的,通常被视为一个错误。因此,如果您故意这样做,则通过使用window.来声明您的意图。

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

对于其他一些属性,如navigatorlocationalert()并不总是很清楚,这些属性可能使用五五没有或不没有。

我看到以下原因:

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

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

窗口对象默认由浏览器初始化。这很好练习显式定义窗口对象它对性能的影响,您的代码将变得可以理解。