我想知道JavaScript中的全局对象是什么以及该对象属于哪个类。
Infinity
,NaN
和undefined
如何成为全球对象的一部分?
答案 0 :(得分:3)
变量作用域由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规范不要求公开全局变量对象。由实施决定。
答案 1 :(得分:1)
没有真正的类,但如果你的意思是全局对象的原型链,the specification doesn't say much:
全局对象的[[Prototype]]和[[Class]]内部属性的值取决于实现。
({[Class]]用于例如window.toString()
,以便您获得"[object global]"
。)
您提到的三个值是全局对象的属性,例如:
Infinity === window.Infinity; // true (in a browser the global object is window)
您无法覆盖这些变量,因此您可以将它们视为文字。但实际上它们是全局对象的属性,因此您可以将它们称为变量(“全局变量”)。