2013-09-27 138 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)範圍內使用。但是你總是可以創建自己的對象並將它們用作名稱空間。