我最近想要探索一些JavaScript的数据结构,并且我意识到我没有一个简单的方法来做到这一点。例如,以下代码:
var a="asdf";
问题是,a
在自己的空间中不存在。它实际上成为window
对象的属性。这导致了一些问题,例如“有什么东西拥有窗口对象吗?”并且“控制台是一个附加到窗口的对象吗?”
我认为能够看到变量或对象的父对象(假设它存在)会非常好。有没有办法让控制台告诉你这个?
答案 0 :(得分:2)
每个javascript环境都有某种全局对象,它“拥有”全局变量和任何其他全局可访问的东西。在浏览器javascript环境中,此全局对象是window
对象。正如您所发现的,浏览器中的所有全局变量实际上都是window
对象的属性。在其他javascript环境(如服务器端JS)中,全局对象不是窗口对象,但仍然存在一个类似的全局对象(尽管它上面没有相同的内置浏览器窗口属性)。 / p>
没有通用的方法来查询变量并找出它包含的对象是什么。并且,在某些情况下(例如函数中的局部变量),没有可访问javascript的包含对象,您可以从中访问变量。
window
对象本身基本上由浏览器拥有或控制。每次浏览器打开新的浏览器窗口或选项卡时,它都会创建一个新的窗口对象。然后,它将文档加载到该窗口对象中以供显示,然后window
和document
对象可供该页面中的javascript访问。
答案 1 :(得分:1)
“有什么东西拥有窗口对象吗?”
是的,window
对象! :-)试试这个:
window.window === window; // true
这很有趣,但这并不意味着window
实际上“拥有”了自己。它包含对自身的引用,称为window
,这就是使window
对象全局可用的原因。
控制台是一个附加到窗口的对象吗?
是
我认为能够看到变量或对象的父对象(假设它存在)会非常好。
这只能在全局(window
)范围内实现。但是你总是可以创建自己的对象并将它们用作命名空间。
答案 2 :(得分:-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
下使用相同的变量名称,通常是避免可能的名称冲突的好习惯。