javascript - 使用 JavaScript 命名空间有什么危险吗?

标签 javascript jquery version-control namespaces project-management

在创建 JavaScript namespace 时,是否存在任何应注意的危险/注意事项?

我们的项目相当庞大,我们正在运行大量 JavaScript 文件(20 多个,预计更多)。不使用命名空间是不可能有任何代码可维护性的,所以我们是这样实现的:

var namespace1 = {

  doSomething: function() {
    ...
  },

  doSomethingElse: function() {
    ...
  }

}

然后为了创建层次结构,我们像这样链接它们:

var globalNamespace = {
  functions1: namespace1,
  functions2: namespace2,
  ...

}

这工作正常,但它本质上是一个让 JS 表现得好像它确实有 namespace 的“技巧”。尽管这种方法被广泛使用,但大多数关于此的文献似乎都关注如何去做,而不是是否有任何可能的缺点。随着我们编写更多的 JS 代码,这很快成为我们系统工作方式的一个组成部分。因此,它的无缝运行非常重要。

是否存在这种“诱导”命名空间系统导致您出错或需要特别注意的情况?我们可以安全地期望所有浏览器的行为相同吗?

最佳答案

您在示例中定义 namespace 的方式似乎是从每个 namespace 创建全局变量,因此您最终得到

window.namespace1
window.namespace2
window.globalNamespace
window.globalNamespace.namespace1
window.globalNamespace.namespace2

因此,如果您有任何破坏 window.namespace1 的东西,它也会破坏 window.globalNamespace.namespace1

编辑:

下面是我们解决这个问题的方法:

namespacing = {
    init: function(namespace) {
        var spaces = []; 
        namespace.split('.').each(function(space) {
            var curSpace = window,
                i;  

            spaces.push(space);
            for (i = 0; i < spaces.length; i++) {
                if (typeof curSpace[spaces[i]] === 'undefined') {
                    curSpace[spaces[i]] = {}; 
                }   
                curSpace = curSpace[spaces[i]];
            }   
        });
    }
};

然后你像这样使用它:

namespacing.init('globalNamespace.namespace1');

globalNamespace.namespace1.doSomething = function() { ... };

这样您就不必引入新的全局变量,您可以自信地添加到现有命名空间而不会破坏其中的其他对象。

关于javascript - 使用 JavaScript 命名空间有什么危险吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8916629/

相关文章:

javascript - 我如何解析 json 值并将 id 放入变量中

javascript - 如何修复 :"Cannot read property ' init' of undefined TypeError”?

jquery - 不需要的传播效应

linux - 如何在另一个目录中的单个 Git 存储库中管理不同目录中的 Linux 设置(配置)文件?

javascript - 用 q 循环并返回值

javascript - 如何在 HTML 或 JavaScript 中输出变量值?

jquery - 如何对 anchor 标记内的无序列表进行排序

javascript - 检查 selectBox 中的元素 id-value(下拉列表)

version-control - 是否有 "dual user check-in"源代码控制系统?

git - 追溯地向树中的文件头添加许可证