2013-09-27 81 views
2

我一直想探索一些JavaScript的数据结构,我意识到我没有一个简单的方法来做到这一点。举个例子,下面的代码:JavaScript - 获取父对象

var a="asdf"; 

的事情是,在a自己的空间并不存在。它实际上成为window对象的属性。这导致了一些问题,例如“是否有窗口对象?”并且“控制台是连接到窗口的对象吗?”

我认为能够看到变量或对象的父对象(假设它存在)会非常好。有没有办法让控制台告诉你这个?

+1

不,不是真的。你所描述的效果确实只适用于全局对象。函数中的局部变量不是您可以操作或“看见”的任何对象的属性。 – Pointy

回答

2

每个javascript环境都有某种全局对象,可以“保存”全局变量和其他全局访问的东西。在浏览器JavaScript环境中,此全局对象是window对象。正如您发现的那样,浏览器中的所有全局变量实际上都是window对象的属性。在其他JavaScript环境(如服务器端JS)中,全局对象不是窗口对象,但仍然存在一个类似工作的全局对象(尽管它没有相同的内置浏览器窗口属性)。

没有通用的方式来查询变量并找出它的包含对象是什么。并且,在某些情况下(如函数中的局部变量),没有可访问的JavaScript对象,您可以从中访问变量。

window对象本身基本上由浏览器拥有或控制。每次浏览器打开新的浏览器窗口或选项卡时,它都会创建一个新的窗口对象。然后它将一个文档加载到该窗口对象中进行显示,然后windowdocument对象就可以访问该页面中的JavaScript。

+0

我发现真正有趣的东西(请参阅我的答案的小字体部分)是,语言确定全局对象的每个属性都是全局可访问的,但全局对象本身不需要可访问。要做到这一点,全局对象必须拥有一个拥有对自身引用的属性(在浏览器中它被命名为“window”)。如果在函数词法环境对象上做了同样的事情,我们也可以迭代局部变量。 – bfavaretto

-1

使用命名空间。

有很多关于它的文章。例如,here

定义命名空间:

var AppSpace = AppSpace || {}; 

然后,所有的变量都将这个命名空间下创建:

AppSpace.Podcast = function { 
    this.title = 'Astronomy Cast'; 
    this.description = 'A fact-based journey through the galaxy.'; 
    this.link = 'http://www.astronomycast.com'; 
}; 

AppSpace.Podcast.prototype.toString = function() { 
    return 'Title: ' + this.title; 
} 

现在,这些变量不会污染window对象。如果页面中包含的JS文件碰巧在window下使用相同的变量名称,通常会避免可能的名称冲突。

1

“是否有自己的窗口对象?”

是的,window对象! :-)试试这个:

window.window === window; // true 

这很有趣,但它并不意味着window实际上“拥有”自己。它包含对自身的引用,称为window,这就是全局可用的对象window的原因。

是控制台附加到窗口的对象?

是的。

我觉得能够看到变量或对象的父对象(假设它存在)会非常好。

这只能在全局(window)范围内使用。但是你总是可以创建自己的对象并将它们用作名称空间。