全局对象是属于哪个类的对象

The global object is an object of which class?

本文关键字:对象 属于 全局      更新时间:2023-09-26

我想知道JavaScript中的全局对象是什么,这个对象属于哪个类。

InfinityNaNundefined如何成为全局对象的一部分?

变量范围在JavaScript中由一个函数定义,函数可以嵌套在其他函数中。

function foo() {
    // new variable scope in here
    var a = "a";
    function bar() {
       // another nested variable scope
       var b = "b";
    }
    bar();
}
foo();

除非有一个默认的"全局"变量范围,它是在程序运行时定义的。它是基本变量作用域,所有函数创建的作用域都嵌套在该作用域中。

那又怎样

每个变量作用域都有一个变量对象(或者更准确地说,是一个"绑定"对象)。它是一个内部对象,您创建的所有局部变量都绑定到该对象。

无法直接访问此变量对象。只能通过声明局部变量(或函数参数,或函数声明)来向其添加属性。并且您只能通过变量名访问属性。

再说一遍,那又怎样

"全局"变量范围是唯一的。它通过在对象上自动定义一个引用回对象本身的属性来公开这个内部变量对象。在浏览器中,特性名为window

因为属性被放置在引用回对象的对象上,并且因为对象上的属性成为变量,所以我们现在可以直接访问全局变量对象。

您可以通过观察window.window属性是对window变量的相等引用来测试这一点。

alert(window.window === window); // true

因此,我们可以向对象window.foo = "bar";添加一个属性,它显示为全局变量alert(foo); // "bar"

请注意,公开此内部对象的唯一变量作用域是全局作用域。没有一个函数作用域暴露它。

还要注意,ECMAScript规范不要求公开全局变量对象。这取决于执行情况。

没有真正的类,但如果你指的是全局对象的原型链,那么规范没有说太多:

全局对象的[[Prototype]]和[[Class]]内部属性的值取决于实现。

([[Class]]用于例如window.toString(),以便您可以获得"[object global]"。)

您提到的三个值是全局对象的属性,例如:

Infinity === window.Infinity;  // true (in a browser the global object is window)

不能覆盖这些变量,因此可以将它们视为文字。但实际上,它们是全局对象的属性,因此您可以将它们称为变量("全局变量")。