我想知道 JavaScript 中的全局对象是什么以及这个对象属于哪个类。
以及如何Infinity
,NaN
以及undefined
全局对象的一部分?
变量作用域在 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)
您无法覆盖这些变量,因此您可以将它们视为文字。但实际上它们是全局对象的属性,因此您可以将它们称为变量(“全局变量”)。