2013-04-22 117 views
0

我對JavaScript的命名空間有個疑問。命名空間的優點是什麼?我什麼時候可以使用命名空間?使用全局變量是不好的習慣嗎?Javascript中的命名空間

+0

隔離,當你想要隔離的東西,通常是:) – 2013-04-22 17:05:02

+0

重複http://stackoverflow.com/questions/4246284/why-are-globals-bad – 2013-04-22 17:08:05

回答

3

將所有變量存儲在全局名稱空間中是一種不好的做法,主要是因爲您打開了名稱衝突。例如,如果您定義了一個名爲Foo的函數,並且您導入了一個也定義了Foo的JavaScript文件,則它們將發生衝突,並在調用時最終隱藏。

命名空間的優點類似於其他語言:

  • 則可以順理成章地組代碼
  • 你可以組織功能集成到更小的,可重複使用的塊
  • 你能避免名稱衝突
  • 您可以避免混淆全局命名空間(導致上述項反)

我相信你開始編寫JavaScript,任何時候,你應該避免將您的功能全局命名空間,並保持你的代碼在自己的名稱空間:

var MyLibrary = MyLibrary || {}; 
MyLibrary.x = function() { ... }; 

這是一個好習慣進入。

+1

的雖然大家都知道正確的答案,這,我認爲你的答案是最清晰和最簡潔的。 +1 – BBagi 2013-04-22 17:08:52

+0

@BBagi謝謝! – 2013-04-22 17:10:10

1

一般命名空間的好處是:

  1. 限制全球範圍內的污染和防止命名衝突
  2. 提供上下文的函數名(我們預計爲WindowUtils.getHeight不同的參數和結果和例如MenuUtils.getHeight)。

無論何時您構建任何重要大小或複雜度的項目,您都可以使用命名空間。

全局通常是一個問題,因爲它更容易命名不同文件之間的衝突和意外副作用。

1

如果可以避免使用全局變量總是不好的,因爲它會混淆無法控制的名稱空間。如果引入了新的插件,或者第二個程序員在您的代碼上工作,並且全局變量名稱被共享,那麼這可能很糟糕,您將會遇到非常不受歡迎且難以追蹤的錯誤。

通過使用你自己的命名空間,你可以將你的函數和變量分隔成一個獨特的,安全的小繭。 :D

2
var company = company || {} ; 

company.doSomething = function() { 
}; 

company.test = {}; 
company.test.submodule = {}; 
company.test.submodule.doSomething = function() {}; 

company.api = {}; 
company.api.submodule = {}; 

通常你應該避免定義全局變量。要獲得清晰的可維護代碼,請使用對象作爲名稱空間並避免污染全局名稱空間。

這也大大增強了默認的JS功能。如果您真的熱衷於此,請在您的項目中添加諸如require.js之類的內容,並且您將獲得非常好的Java類功能。

所以對於require.js,您的company.api和company.test可以放置在不同的文件中,並且需要對方,就像使用Java包進行import.test一樣。

命名空間是一種非常有效的做法。你得到:

  1. 可讀性(世界上最重要的!!)。
  2. 可維護性。
  3. 更快的調試。
  4. 更快的代碼升級/代碼交付。
  5. 延遲加載和縮小比較容易,可以使用大量工具。
  6. 邏輯和功能的高效劃分。
  7. 防止IE窗口與全局對象錯誤。
  8. 使團隊中的工作可能和愉快。
  9. 加快發展很多。大多數IDE將根據您的命名空間進行鍵入時索引和自動填充函數名稱等。
  10. 你可以有效地使用jsDoc標籤來記錄你的JavaScript代碼。
  11. 您可以避免與其他庫的衝突。
+0

更快的升級?這是一個很好的列表,但我沒有得到那個 – 2013-04-22 17:19:08