Global对象和浏览器的window对象

Global对象是EMCAScript的一个单体内置对象。

ECMA-262对内置对象的定义是:“由ECMASript实现提供的、不依赖于宿主环境的对象,这些对象在ECMAScript程序执行以前就已经存在了。开发人员不必显式地实例化内置对象,因为它们已经实例化了。

ECMAScript中的Global对象在某种意义上是作为一个终极的“兜底对象”来定义的,不属于任何其他对象的属性和方法,最终都是它的属性和方法。事实上,没有全局变量和全局函数,所有在全局作用域中定义的属性和函数,都属于Global对象的属性。

关于Window对象
ECMASript没有指出如何直接访问Global对象,但Web浏览器都是将这个全局对象作为window对象的一部分加以实现的。因此,在全局作用域中声明的所有变量和函数,就都成为了window对象的属性了。

一个全局对象是一个永远存在于 global scopeobject.

在 JavaScript 中, 有一个永远被定义的全局对象. 在一个 web 浏览器中, 当脚本创建全局变量时, 他们作为该全局对象的成员被创建. (在 Node.js 不是这样.) 全局对象的 interface 取决于脚本在其中运行的执行上下文. 例如:

  • 在Web浏览器中,脚本没有专门作为后台任务启动的任何代码都将Window 作为其全局对象。这是Web上绝大多数的JavaScript代码。
  • Worker 中运行的代码将WorkerGlobalScope 对象作为其全局对象。
  • Node.js 环境下运行的脚本具有一个称为[global](https://nodejs.org/api/globals.html#globals_global) 的对象作为其全局对象。

总结来说,Global是一个抽象的概念,凡是应用了ECMASript标准的环境都需要一个具象化一个Global对象,这个具象化的对象具有但不限于Global的所有特性。在浏览器中是window,在Worker中是WorkerGlobalScope,在Node.js中则是global。这是角色和演员的关系。
下面提供一种获得Global对象的方法:

var global = function(){
    return this;
}();

在没有给函数明确指明this的值的情况下(无论是通过函数添加为对象的方法,还是通过调用call()或apply()传入作用域),this值等于Global对象。

感谢阅读!

参考:https://developer.mozilla.org/zh-CN/docs/Glossary/Global_object

posted @ 2021-04-12 09:13  叶际参差  阅读(719)  评论(0编辑  收藏  举报