我们为什么要写窗口
Why do we write window.?
在向网页添加一些初始化代码时,我发现自己在写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
.因此,您可以根据您希望何时执行脚本来定义它。
窗口对象默认由浏览器初始化。这很好练习显式定义窗口对象它对性能的影响,您的代码将变得可以理解。
- 为什么不是't窗口.恢复正常工作吗?(javascript/jquery)
- 为什么不显示警报窗口
- 为什么不'我的窗口滚动事件根本没有启动.其他答案没有解决问题
- 为什么我在以编程方式打开窗口时遇到问题
- 为什么当我尝试将函数绑定到自身时,“this”对象仍然引用窗口
- 为什么我的firefox扩展javascript不能访问opener窗口,也看不到window.name
- 为什么这个JS确认窗口没有在表单提交时启动
- 为什么jQuery可以从内部调用窗口,却要将窗口发送给自己
- 为什么我的html弹出窗口显示我的函数的文本,而不是运行它们
- 为什么我的URL在JavaScript中被调用为弹出窗口
- 为什么Javascript中的跨框架或窗口数组如此难以识别
- 如果在外部单击,则隐藏弹出窗口.为什么我的脚本没有'不起作用
- 为什么根据括号的位置来引用窗口或对象?并返回undefined
- 为什么我需要让我的电子窗口比我的画布大
- 多个弹出窗口,但只有一个有效..为什么?
- 为什么有时浏览器阻止弹出窗口,有时不
- 为什么简单的 JQuery 对话框/弹出窗口不起作用
- 为什么“this”在这个TypeScript片段中指的是“窗口”
- 为什么全局作用域中的变量被分配给窗口对象
- Javascript:为什么选项卡正在刷新,为什么不弹出浏览器窗口?为什么弹出的浏览器窗口没有刷新