2010-08-04 25 views
2

今天晚些時候,我是通過ejhon.com幻燈片滾動,我發現了以下工作:JavaScript的新的關鍵字和對象作用域

給這個代碼

function katana() { 
this.myvar = true; 
} 
katana(); 
console.info (myvar); 

過去的那一刻我編譯的代碼,我認爲myvar附屬於katana功能。實際上,它會附加到污染全局命名空間的窗口對象。

我回到自己的項目,這些項目都採用同樣的辦法..有點不同

function katana() { 
this.myvar = true; 
} 
var xyz = new katana(); 
console.info (myvar); 

我有一個函數對象,而不是執行的功能,我只是創建它的一個新實例(我並不確定發生了什麼)。然後我使用xyz存儲值並通過原型方法使用這些值來完成一些工作。

讓我感到驚訝的是,當我用FireBug進行一些調試時,xyz並不存在。沒有變量附加​​到窗口對象。爲什麼?

我做了一些更多的調試,xyz對象連接到window> object,但是在DOM中它並不明顯,也沒有任何痕跡。在調試窗口中還有一些新東西,一個叫做「scopechain」的節點帶有一個調用,它具有xyz對象的值。

好的,底下發生了什麼?這是一種我應該堅持的好方法,還是我應該尋找替代方案? 我看了一些問題和答案,我主要是在尋找這種方法在後臺做什麼。

+0

閱讀本文http://ejohn.org/apps/learn/ – 2010-08-04 19:35:04

+0

其實我正在瀏覽它。我只是尋找更深的解釋,因爲這些幻燈片只顯示結果。 – 2010-08-04 19:42:25

回答

2

當您說new katana()時,Javascript會調用katana函數,其中一個新的空白對象爲this。一旦它返回,大概初始化,新的對象(或任何katana返回,只要它是一個對象)被設置爲使其「原型」(它將繼承字段等的對象)與katana函數的原型。

是的,這也沒有什麼意義,或者我第一次經歷它。過於簡化的版本是,你說new katana(),和Javascript創建什麼將是katana實例,並讓katana函數初始化它。你說katana()this基本上是調用堆棧中最後一個在實例方法調用中使用的對象。 (如果您的來電是x.foo,this == x。)如果沒有這樣的對象,看起來thiswindow相同。

至於爲什麼xyz沒有出現,您聲明變量爲var。這改變了範圍。如果你擺脫了這一點,你會看到一個window.xyz

+0

很好的答案。我主要是想知道地下發生了什麼。那麼FireBug中新的'scopechain'節點呢?另外xyz似乎被附加到窗口對象,它只是不存在於DOM中。 – 2010-08-04 19:44:23

+0

我不使用FireBug(或Firefox,就此而言)。 'scopechain'的東西可能是Firefox追蹤範圍的方式。但它似乎並沒有出現在Chrome中,而且據我所知,它不是標準的Javascript/ECMAScript。 – cHao 2010-08-05 02:45:08

相關問題