2012-03-17 44 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