我一直在阅读 Rickshaw 图表库的源代码,我发现了这个片段:
var Rickshaw = {
namespace: function(namespace, obj) {
var parts = namespace.split('.');
var parent = Rickshaw;
for(var i = 1, length = parts.length; i < length; i++) {
var currentPart = parts[i];
parent[currentPart] = parent[currentPart] || {};
parent = parent[currentPart];
}
return parent;
},
...
现在我明白这是命名空间的对象文字表示法。
稍后,当定义单个“模块”时,将使用以下语法:
Rickshaw.namespace('Rickshaw.Graph');
Rickshaw.Graph = function(args) {
...
有人可以向我解释一下这里发生的事情吗?为什么他们需要一个 namespace
函数,而只写下面的代码是完全合法的?:
Rickshaw.Graph = function(args) {
...
如果我不得不下注,我猜是这样我们可以定义如下内容:
Rickshaw.Something.AnotherThing
不用担心我们是否已经定义了 Rickshaw.Something
。
这是好的做法,是否普遍?
最佳答案
您是正确的,对于 Rickshaw.Graph
,namespace
函数调用是不必要的。然而,这种命名空间
函数对于更深层次的命名空间(Rickshaw.Graph.Foo.Bar
)很有用,其中代码定义Rickshaw.Graph.Foo
可能尚未加载。
namespace
函数调用仍然包含在较浅的命名空间中 - 它有助于防止错误,如果 Rickshaw.Graph
被重构为调用 Rickshaw.Display.Graph
,然后进行更改的人将看到 namespace
调用并更新它,而不必记住添加它。
关于您的最后一个问题(是否常见)- 很难说。许多项目没有那么多不同的组件,以至于这些深度的、Java 风格的命名空间是必要的。这个想法肯定不仅仅存在于人力车中——例如 ExtJS 有 Ext.ns()
做同样的事情。
关于javascript - Javascript 中的这个命名空间函数有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17282932/