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

标签 javascript

我一直在阅读 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.Graphnamespace 函数调用是不必要的。然而,这种命名空间函数对于更深层次的命名空间(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/

相关文章:

javascript - 使用javascript修改一类元素的样式

javascript - JSON 加载函数从其他程序读取 key

javascript - jQuery 淡入新图像 - 然后继续循环图像列表?

javascript - 禁用和启用 html 输入按钮

javascript - 如何检查用户参数以匹配Firebase中的值?

javascript - 淡入淡出javascript

javascript - Highcharts 实心仪表,在仪表中显示先前停靠点的颜色

javascript - 为什么phaser在手机上会闪烁?

javascript - 单击按钮在一个站点上有效,但在其他站点上无效

javascript - typescript 中的 ES6 map