8

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

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

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

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

而在现实中,alert它只是window对象的一种方法onload
那么,为什么会有差异?为什么甚至像W3C这样的正式网站也这样做?

4

4 回答 4

5

我看到以下原因:

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

window.当我们想明确表达它时,我们就会写作。基本上有两种情况可以使用它:

  • 对象的属性和方法——作为接口window一部分的一切。您提到的监听器就是一个例子,诸如, , , , ,之类的东西是其他的。Window.onloadwindow.scrollYwindow.statuswindow.parentwindow.open()window.focus()window.removeEventListener()
  • 创建全局属性。从任何范围赋值window.myGlobalVar是创建全局“变量”的常见 JS 习惯用法。诚然,用 . 显式声明它仍然是更好的做法var

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

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

对于其他一些属性,例如navigator,location或者alert()它并不总是很清楚,并且可能使用了 550 没有或没有。

于 2015-10-24T10:16:31.433 回答
1

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

于 2015-10-23T15:25:13.307 回答
-2

window 对象默认由浏览器初始化。显式定义窗口对象是一种很好的做法,它会影响性能,您的代码将变得易于理解。

于 2015-10-23T16:20:08.113 回答