2017-01-23 80 views
-2

應該'這個'。或'var'用於在Javascript類中創建變量,或者使用哪個變量無關緊要。顯然那些與此定義。可以從對象外部訪問,而用var定義的那些不會但是還有其他區別嗎?Javascript類變量 - 這個。或var

function myClass() { 
 
\t this.count = 0; 
 
\t this.oTimer = null; 
 
    this.getCount = function() { return(this.count); } 
 
} 
 
oMyObj = new myClass(); 
 
oMyObj.getCount(); // returns 0

,而不是

function myClass2() { 
 
\t var count = 0; 
 
\t var oTimer = null; 
 
    this.getCount = function() { return(count); } 
 
} 
 
oMyObj = new myClass2(); 
 
oMyObj.getCount(); // returns 0

+2

'var'使計數隱藏。對於'this.count',您可以通過執行'oMyObj.count'來訪問計數。閱讀關於JavaScript作用域和閉包。 –

+0

詞彙範圍界定我的朋友:) – jdmdevdotnet

+2

它完全取決於你想要的可見性。 「this」的使用意味着「它是這個班級的明顯成員」。它還將該意圖傳達給其他開發人員。使用「var」意味着「不要在外面使用」(並再次傳達該意圖)。但是,請注意,在JavaScript中,最終通常可以獲取任何數據,而不管開發人員如何試圖隱藏它。模塊模式等可以很好地解決編譯時違規等問題,但是好的括號符號幾乎勝過任何東西。 –

回答

2

試圖解釋一下更詳細的比多米尼克的評論:

如果您使用var關鍵字,則該變量僅在其運行範圍內有效。這意味着在構造函數運行後(函數體),變量會丟失(因爲它們只在構造函數中有效)。

如果您想訪問構造函數以外的變量(例如member-methods),您必須通過關鍵字this將變量綁定到類本身。現在他們的範圍是類本身,而不僅僅是構造函數。


編輯:

進一步解釋:雖然您可以使用與var的方法裏面,你也構造函數中的聲明,因爲它們是在同一範圍內(見例問題的)定義聲明的變量,無法通過其他通過Function.prototype添加的其他方法訪問它們。

爲了證明這一點,我創建了一個小JSFiddle example

所以它通常更好的做法定義與一類的所有變量(即你不僅使用在構造函數中的臨時變量的意圖) this關鍵字。

+0

Michael,剛剛測試了這個理論,但似乎用var聲明的變量實際上對成員方法是可見的,就像那些用這個聲明的變量一樣。將編輯原始文章中的示例進行演示。 – NickC

+1

@NickC是的,但那只是因爲你在相同的作用域(構造函數)中定義了方法。看看這個小提琴,我嘗試了另一種添加成員方法的方法(通過原型):https://jsfiddle.net/oo2gamzn/1/。雖然在定義函數體內部的方法時它可能與變量一起工作,但是對於在構造函數 –

+0

Michael之外使用的變量使用'this'通常是更好的做法,感謝那個完全解釋不同之處的jsfiddle,現在我明白了。我有一種感覺存在差異,但無法理解它是什麼。歡呼聲, 如果您想重複作爲答案,我可以將其標記爲接受的解決方案。 – NickC