这个命名空间函数在Javascript中有什么作用?

时间:2013-06-24 18:57:08

标签: javascript

我一直在阅读人力车图表库的源代码,我找到了这个片段:

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

这是一种很好的做法吗,这是常见的吗?

2 个答案:

答案 0 :(得分:2)

对于Rickshaw.Graph,您是正确的,namespace函数调用是不必要的。但是,此类namespace函数对于更深层的命名空间(Rickshaw.Graph.Foo.Bar)非常有用,其中定义Rickshaw.Graph.Foo的代码可能尚未加载。

按惯例,仍然为较浅的命名空间包含namespace函数调用 - 它有助于防止出现错误,如果Rickshaw.Graph被重构为被调用Rickshaw.Display.Graph,那么更改将看到namespace调用并更新它,而不必记住添加它。

对于你的最后一个问题(这是常见的) - 很难说。许多项目没有那么多不同的组件,这些深层的Java风格的命名空间是必需的。这个想法绝对不仅仅存在于人力车中 - 例如ExtJS有Ext.ns()也可以做同样的事情。

答案 1 :(得分:-1)

Rickshaw.Something.AnotherThing会因为你还没有定义'Something'而导致TypeError。

你需要做类似

的事情
if (typeof Rickshow !== "undefined" && Rickshow !== null) {
  Rickshow;
} else {
  if (Rickshow.Something == null) {
   Rickshow.Something = {};
  }
};
Rickshow.Something.AnotherThing = {};

这个命名空间函数可能只是帮助你不必编写上述内容。