为什么会有window.window这种设计

简介: 为啥要搞这个这个看起来貌似很奇葩的设计。要解答这个问题,还得请出this,我们经常说浏览器中的全局对象是window, 这句话对了,也还没完全对。全局对象的真实身份应该是全局作用域的this。 window只是为了便于访问this,弄出来的一个属性。

1.JPG


为什么会有window.window这种设计



先看一下,下面的的等式都等于true。


window === window.window
window.window === window.window.window
window.window.window === window.window.window.window
复制代码


为啥要搞这个这个看起来貌似很奇葩的设计。


要解答这个问题,还得请出this,我们经常说浏览器中的全局对象是window, 这句话对了,也还没完全对。


全局对象的真实身份应该是全局作用域的this。 window只是为了便于访问this,弄出来的一个属性。


this === window // true
复制代码


再看一段代码,假设只有this, 没有window属性的时候。


想输出全局对象的aName,怎么输出????


var aName = "global的name";
function a() {
  var aName = "local的name";  
  // 想输出全局对象的aName???
  console.log(????);
}
a();
alert("哈哈")
复制代码


那就得做外的工作,

var xxxx = this;
var aName = "global的name";
function a() {
  var aName = "local的name";  
  // 想输出全局对象的aName???
  console.log(xxxx.name);
}
a();
alert("哈哈")
复制代码


只不过实际的起名,不会像我那么随便,人家叫window而已。

显然这样不太好,我们知道,全局的属性,可以直接访问到,不需要 this.的形式。


于是就可以在this上面加一个window属性等于this


this.window = this;
// 全部变量,可以直接访问,不需要带着this
window === this;
复制代码


这里强调一下,全局对象this上的属性可以不使用this.x形式访问,而是直接x可以访问。

这样就可以直接通过window获得全局对象this呢? 是不是很赞。


我们就可以推导 ,基于 window === this


this === this.window (this即window,其有window属性) === this.window.window
// 去掉this
window === window.window
复制代码


所以,最主要的原因是更方便使用this而已。

我们也可以通过代码验证一下


this.window  // Window
window.this  // undefined
复制代码


当然,现在有globalThis, 来统一访问全局对象。


globalThis === this === window
复制代码

写在最后



不忘初衷,有所得,而不为所累,如果你觉得不错,你的一赞一评就是我前行的最大动力。


技术交流群请到 这里来。 或者添加我的微信 dirge-cloud,一起学习。

相关文章
|
监控 JavaScript 前端开发
|
7月前
|
传感器 数据安全/隐私保护 开发者
《解锁分布式软总线:跨设备业务开发全攻略》
在数字化时代,分布式软总线技术作为实现设备间高效互联的核心,为跨设备业务开发提供了新可能。它通过发现、连接、组网和传输接口,打破设备通信壁垒,支持异构设备协同工作。开发者可利用这些接口设计智能应用,如多设备协同办公,同时需关注网络适应性与兼容性测试,以确保用户体验的流畅性和一致性。掌握该技术不仅能紧跟科技潮流,还能为用户带来便捷高效的数字化生活体验。
271 8
|
8月前
|
存储 JSON 关系型数据库
【亲测有用】数据中台数据集成管理能力演示
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。
【亲测有用】数据中台数据集成管理能力演示
|
10月前
|
Java API
一个线上问题让我发现了Calendar类中的秘密-周一真的是每周的第一天吗?
在开发一个查询未完成业务的需求时,遇到了一个问题:清明节后周日提前查出了应于周一才显示的未完成业务。原因是代码中使用了`Calendar`类,默认将周日视为一周的第一天,导致当天获取的“本周一”实际上是下周一。通过调试发现,`Calendar`类的默认设置与实际需求不符。为解决此问题,提出了三种方案:1. 加入判断机制,对周日特殊处理;2. 修改`Calendar`类的设置,将周一设为一周的第一天;3. 使用其他日期处理库如Hutool,默认以周一为一周的开始。此次排错提醒我们在日常开发中需深入了解所用类库的实现细节,以便更好地应对潜在问题。
374 14
|
运维 安全 BI
【运维有小邓】如何进行AD域文件权限管理?
在网络资源管理中,谁可访问资源及访问级别至关重要。Active Directory环境下,管理文件服务器权限耗时且繁琐。ADManager Plus提供批量管理用户NTFS和共享权限的功能,简化权限分配、修改与撤销流程,提升管理效率,确保资源安全。通过集中式界面,管理员能快速准确地控制资源访问,优化环境管理。
342 1
【运维有小邓】如何进行AD域文件权限管理?
|
网络协议 自动驾驶 物联网
计算机网络的发展
本文概述了计算机网络从20世纪60年代的雏形到现代互联网的发展历程,包括ARPANET的创建、TCP/IP协议的标准化、DNS系统的引入、万维网的诞生、宽带和无线网络的兴起,以及移动互联网、云计算、物联网、区块链和自动驾驶技术的最新进展。
743 1
|
存储
计算机中补码的意义
补码在计算机中用于表示有符号数,解决了符号位参与运算的问题,简化了硬件设计,同时能够表示更多的数值,提高了计算效率和精度。
1061 12
|
算法 程序员
程序设计的五个步骤
程序的设计过程,并不是立刻就进行代码设计,一般来讲包括设置文件的存放位置、说明书的设计、代码设计、程序测试、程序调试、注释说明。
1043 6
|
资源调度 前端开发 JavaScript
Vite:新一代前端构建工具的革命性体验
【10月更文挑战第13天】Vite:新一代前端构建工具的革命性体验
|
网络协议 安全 物联网