2012-03-17 45 views
2

我非常新手在關閉, 我讀的教程在:https://developers.google.com/closure/library/docs/tutorial 和它說,在封庫使用提供

goog.provide('tutorial.notepad.Note'); 

相當於

tutorial = tutorial || {}; 
tutorial.notepad = tutorial.notepad || {}; 
tutorial.notepad.Note = tutorial.notepad.Note || {}; 

基礎上這個事實,我假設如果使用goog.provide('tutorial.notepad.Note');

那麼就沒有必要使用goog.provide('tutorial.notepad);

但這個例子一起使用了它們。 可能有人向我解釋爲什麼?

回答

1

goog.provide(namespace)將檢查從左邊開始的每個以點分隔的名稱,並創建一個指向與上面提供的tutorial摘錄相同的新對象文字的屬性。因此,您正確地認爲notepad.js在技術上並不需要包含goog.provide('tutorial.notepad'),因爲goog.provide('tutorial.notepad.Note')將確保對象鏈tutorial.notepad存在。

然而,除了定義與成員函數makeNoteDom一個Note對象,notepad.js還定義了一個利用率函數makeNotes,這是命名空間tutorial.notepad的成員。通過包含goog.provide(tutorial.notepad),它表示除定義Note對象之外,notepad.js還提供了包級功能。

+0

謝謝cpeisert。我不知道他們爲什麼不能在他們的教程中添加評論。這將是很大的好處,並會涵蓋這些問題。 – 2012-03-19 09:12:16

+0

@cpeisert所以總是定義名稱空間不是明智的,但不包括任何對象?例如,即使tutorial.notepad.Note是notepad.js中唯一聲明和定義的,只需使用goog.provide('namespace.notepad'); ?? – 2013-08-28 19:39:49

+0

@ rodrigo-silveira我建議學習[Closure Library代碼](https://code.google.com/p/closure-library/source/browse/#git%2Fclosure%2Fgoog)。您會發現,名稱空間幾乎總是使用'goog.provide'聲明,然後爲在同一個文件中的命名空間內定義的每個對象附加'goog.provide'語句。 – 2013-08-29 05:01:55