我一直想探索一些JavaScript的数据结构,我意识到我没有一个简单的方法来做到这一点。举个例子,下面的代码:JavaScript - 获取父对象
var a="asdf";
的事情是,在a
自己的空间并不存在。它实际上成为window
对象的属性。这导致了一些问题,例如“是否有窗口对象?”并且“控制台是连接到窗口的对象吗?”
我认为能够看到变量或对象的父对象(假设它存在)会非常好。有没有办法让控制台告诉你这个?
我一直想探索一些JavaScript的数据结构,我意识到我没有一个简单的方法来做到这一点。举个例子,下面的代码:JavaScript - 获取父对象
var a="asdf";
的事情是,在a
自己的空间并不存在。它实际上成为window
对象的属性。这导致了一些问题,例如“是否有窗口对象?”并且“控制台是连接到窗口的对象吗?”
我认为能够看到变量或对象的父对象(假设它存在)会非常好。有没有办法让控制台告诉你这个?
每个javascript环境都有某种全局对象,可以“保存”全局变量和其他全局访问的东西。在浏览器JavaScript环境中,此全局对象是window
对象。正如您发现的那样,浏览器中的所有全局变量实际上都是window
对象的属性。在其他JavaScript环境(如服务器端JS)中,全局对象不是窗口对象,但仍然存在一个类似工作的全局对象(尽管它没有相同的内置浏览器窗口属性)。
没有通用的方式来查询变量并找出它的包含对象是什么。并且,在某些情况下(如函数中的局部变量),没有可访问的JavaScript对象,您可以从中访问变量。
window
对象本身基本上由浏览器拥有或控制。每次浏览器打开新的浏览器窗口或选项卡时,它都会创建一个新的窗口对象。然后它将一个文档加载到该窗口对象中进行显示,然后window
和document
对象就可以访问该页面中的JavaScript。
我发现真正有趣的东西(请参阅我的答案的小字体部分)是,语言确定全局对象的每个属性都是全局可访问的,但全局对象本身不需要可访问。要做到这一点,全局对象必须拥有一个拥有对自身引用的属性(在浏览器中它被命名为“window”)。如果在函数词法环境对象上做了同样的事情,我们也可以迭代局部变量。 – bfavaretto
使用命名空间。
有很多关于它的文章。例如,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
下使用相同的变量名称,通常会避免可能的名称冲突。
“是否有自己的窗口对象?”
是的,window
对象! :-)试试这个:
window.window === window; // true
这很有趣,但它并不意味着window
实际上“拥有”自己。它包含对自身的引用,称为window
,这就是全局可用的对象window
的原因。
是控制台附加到窗口的对象?
是的。
我觉得能够看到变量或对象的父对象(假设它存在)会非常好。
这只能在全局(window
)范围内使用。但是你总是可以创建自己的对象并将它们用作名称空间。
不,不是真的。你所描述的效果确实只适用于全局对象。函数中的局部变量不是您可以操作或“看见”的任何对象的属性。 – Pointy