我一直想探索一些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