在向网页添加一些初始化代码时,我发现自己在写window.onload = ...
,这时一个想法突然袭击了我。
window.
不是必需的,因为window
是当前对象。所以它是可选的!
但是没有人只写onload = ...
,我想知道为什么会这样。
我的意思是,我们对写其他东西没有任何疑虑,比如说没有window.
限定符的alert
。
window.onload = function() {
alert('Your window has loaded');
};
而实际上,alert
就像onload
一样是window
对象的方法。
那么,为什么会有差异呢?为什么像W3C这样的正式网站也要这样做?
当我们想要明确说明它时,我们会写window.
。基本上有两种情况,这是使用它的好形式:
window
对象的属性和方法 - 属于Window
接口的所有内容。你提到的.onload
侦听器就是一个例子,比如window.scrollY
、window.status
、window.parent
、window.open()
、window.focus()
、window.removeEventListener()
等。- 创建全局属性。从任何范围分配给
window.myGlobalVar
是创建全局"变量"的常见 JS 习惯用法。诚然,用var
明确声明它还是更好的做法。
虽然我们可以在这里"选择性地"省略window.
部分,但这并不常见。特别是通过赋值创建隐式全局变量是被鄙视的,通常被视为一个错误。因此,如果您故意这样做,则通过使用window.
来声明您的意图。
然而,第一种情况并不总是明确界定的。当我们要使用的属性本质上是一个静态的全局变量时,我们经常省略window.
部分,并且不一定与window
对象相关,即使它被正式指定在它上面。你很少看到有人使用带有window.
前缀的document
、atob()
、Worker
、setTimeout()
或fetch()
,就像你不使用window.JSON.parse
或window.Array
作为内置对象一样(尽管它是有效的(。
对于其他一些属性,如navigator
,location
或alert()
并不总是很清楚,这些属性可能使用五五没有或不没有。
我看到以下原因:
- 减少范围链上的搜索将略微提高性能。这在 IIFE 中也可以看到,其中
window
作为参数发送到函数,并在其中使用对窗口的本地引用。 - 如果在全局
window
上定义的函数/成员在作用域中被覆盖,则它将无法按预期工作,因此显式引用会使其引用正确的函数/成员。这对于创建与全局函数/成员同名的函数/成员并且仍然能够从重影作用域访问全局成员很有用。
因为.onload
不是window
独有的。例如,它也可以用作document.onload
.因此,您可以根据您希望何时执行脚本来定义它。
窗口对象默认由浏览器初始化。这很好练习显式定义窗口对象它对性能的影响,您的代码将变得可以理解。