2

I've been wanting to explore some of JavaScript's data structures lately and I realized I don't have an easy way to do it. Take, for instance, the following code:

var a="asdf";

The thing is, a doesn't exist in its own space. It actually becomes a property of the window object. This led to some questions, such as "Does anything own the window object?" and "is the console an object attached to the window?"

I figure that being able to see the parent object (assuming it exists) of a variable or object would be really nice. Is there a way to have the console tell you this?

4

3 回答 3

2

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

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

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

于 2013-09-27T22:03:24.987 回答
1

“有什么东西拥有窗口对象吗?”

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

window.window === window; // true

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

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

是的。

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

这只能在全局 ( window) 范围内实现。但是您始终可以创建自己的对象并将它们用作命名空间。

于 2013-09-27T21:43:48.680 回答
-1

使用命名空间。

有很多关于它的文章。例如,这里.

定义一个命名空间:

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.

于 2013-09-27T21:43:00.153 回答