为什么会有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,一起学习。

相关文章
|
小程序 Java 物联网
基于java的坦克大战游戏的设计与实现--开题报告--【毕业论文】
基于java的坦克大战游戏的设计与实现--开题报告--【毕业论文】
WK
|
10月前
|
安全 Java 编译器
C++和Java哪个更好用
C++和Java各具优势,选择取决于项目需求、开发者偏好及目标平台特性。C++性能出色,适合游戏、实时系统等;Java平台独立性强,适合跨平台、安全敏感应用。C++提供硬件访问和灵活编程范式,Java有自动内存管理和丰富库支持。两者各有千秋,需根据具体需求选择。
WK
240 1
|
缓存 Python
【python脚本】word批注状态批量提取器V1版本
【python脚本】word批注状态批量提取器V1版本
305 0
|
算法 编译器
开源:智能宠物弹射喂食器连载贴之步进电机控制(二)
开源:智能宠物弹射喂食器连载贴之步进电机控制(二)
350 0
|
传感器 机器学习/深度学习 监控
实时交通信息采集与处理
实时交通信息采集与处理
573 3
|
芯片
飞腾CPU FT-2000/4 uboot下PHY调试记录
飞腾CPU FT-2000/4 uboot下PHY调试记录
952 0
飞腾CPU FT-2000/4 uboot下PHY调试记录
|
Ubuntu Linux API
FFmpeg静态编译
FFmpeg静态编译
718 0
|
网络虚拟化 数据安全/隐私保护 网络架构
计算机网络学习24:虚拟专用网VPN与网络地址转换NAT
因特网中对目的地址是私有地址的IP数据报一律不进行转发。 并且私有地址只能是本地使用,不可以作为对外的IP地址。 很显然,各部门都需要一个合法的具有IP地址的路由器。 这样,他们各自的专用网才能利用公用的因特网进行通信。
计算机网络学习24:虚拟专用网VPN与网络地址转换NAT
动态内存管理:realloc扩容(缩容)函数详解
动态内存管理:realloc扩容(缩容)函数详解
249 0
动态内存管理:realloc扩容(缩容)函数详解
|
机器学习/深度学习 人工智能 资源调度
里工实业:用宜搭自主搭建MES系统,实现生产全流程管理
里工实业是全球智能制造AIoT装备市场的创新者,用宜搭自主搭建MES系统,实现了生产全流程管理。
1500 0
里工实业:用宜搭自主搭建MES系统,实现生产全流程管理