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

相关文章
|
5月前
|
存储 安全 开发者
|
API
window resize和scroll事件性能优化
window resize和scroll事件性能优化
247 0
|
前端开发
前端 window 和 window.location
前端 window 和 window.location
前端 window 和 window.location
|
前端开发
前端面试题:1.页面加载完成(onload)之前触发的事件;2.History,Location,Window,Navigation的区别;3.e.target和e.currentTarget的区别
★Navagator:提供有关浏览器的信息 ★Window: Window对象处于对象层次的最顶层, 它提供了处理Navagator窗口的方法和属性 ★Location:提供了与当前打开的URL-工作的方 法和属性,是一个静态的对象 ★History:提供了与历史清单有关的信息 ★Document:包含与文档元素一起工作的对象,它将这些元素封装起来供编程人员使用
280 0
|
前端开发 JavaScript 数据安全/隐私保护
58、window 对象
浏览器里面,window对象(注意,w为小写)指当前的浏览器窗口。它也是当前页面的顶层对象,即最高一层的对象,所有其他对象都是它的下属。一个变量如果未声明,那么默认就是顶层对象的属性。
249 0
|
存储 数据可视化 程序员
Window Form 控件基础
在开始正式介绍如何开发自定义控件之前,有必要先了解一下控件开发的基础知识。下面从控件的概念、分类和开发模式上对控件做一个基本的概述。
870 0
Window Form 控件基础
解决popup不随着window一起移动的问题
原文:解决popup不随着window一起移动的问题 当我们设置Popup的StayOpen="True"时,会发现移动窗体或者改变窗体的Size的时候,Popup并不会跟随着一起移动位置。为了解决这个问题,可以给Popup定义一个附加属性,代码如下所示: /// /// Popup帮助类...
1114 0
|
安全 PHP Windows
window的特性
参考文献:https://xz.aliyun.com/t/2318https://www.jianshu.com/p/96cf08d569bcWinAPI与通配符 在Windows环境下使用PHP时,PHP中的部分函数会调用2个底层Windows AP...
1106 0