全局变量只是`window`对象的属性吗?

时间:2013-11-08 09:41:35

标签: javascript browser scope window

每当我在浏览器上看到一个网站时,就会运行一个javascript实例。我可以在控制台中声明一个全局变量(DevTools);

var a = 1234567890; 

此变量已在全局范围内声明,以便我可以像这样获取变量的值;

> a 
1234567890

但是,我也可以这样做;

> window.a 
1234567890 

我是否正确理解window对象是包含浏览器中网站实例中所有全局变量的对象?如果是这样,窗口对象属于什么范围?这让我有点困惑;

> window 
Window {top: Window, window: Window, location: Location, external:, ...}  
> window.window 
Window {top: Window, window: Window, location: Location, external:, ...}  
> window.window.window 
Window {top: Window, window: Window, location: Location, external:, ...}  

window对象是否是最终的全局对象,是否有一个名为window的对象引用回自身?

4 个答案:

答案 0 :(得分:13)

  

window对象是最终的全局对象吗?是否有一个名为window的对象引用回自身?

是的,是的。例如,这会返回true

window.window.window.window.window === window.window;

如果您有兴趣,可以使用window获取Object.keys对象(以及所有全局变量)的所有属性的列表:

console.log(Object.keys(window));

但请注意,如果您花费太多时间考虑全局变量,则代码体系结构可能存在问题。

答案 1 :(得分:4)

是的,window对象是

全局对象 (§15.1 ES5 Specification)

  

在控件进入任何对象之前创建唯一的全局对象   执行上下文。

     

除非另有说明,否则标准的内置属性   全局对象具有属性{[[Writable]]:true,[[Enumerable]]:   false,[[Configurable]]:true}。

     

全局对象没有[[Construct]]内部属性;它   无法将全局对象用作new的构造函数   操作

     

全局对象没有[[Call]]内部属性;它是   无法将全局对象作为函数调用。

     

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

     

除了本规范中定义的属性全局   对象可能具有其他主机定义的属性。 这可能包括a   属性,其值是全局对象本身; 例如,在    HTML文档对象模型全局对象的窗口属性是   全局对象本身。

答案 2 :(得分:1)

所有全局变量都成为窗口对象的属性。

>>> window.somevar = 1;
1
>>> somevar
1

所有核心JavaScript函数都是窗口对象的方法

答案 3 :(得分:-1)

是的,Window是DOM(文档对象模型)对象层次结构的根元素。