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