编程语言
首页 > 编程语言> > 使用JavaScript命名空间有任何危险吗?

使用JavaScript命名空间有任何危险吗?

作者:互联网

在创建JavaScript命名空间时,是否应该注意任何危险/警告?

我们的项目相当广泛,我们运行了很多JavaScript文件(20个,期待更多).没有使用命名空间就不可能有任何代码可维护性,所以我们这样实现它们:

var namespace1 = {

  doSomething: function() {
    ...
  },

  doSomethingElse: function() {
    ...
  }

}

然后创建层次结构,我们将它们链接起来:

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

}

这工作正常,但它本质上是一个“技巧”,使JS表现得好像它确实有名称空间.尽管这种方法得到了很多应用,但大多数关于此的文献似乎都集中在如何做到这一点,而不是是否存在任何可能的缺点.随着我们编写更多JS代码,这很快就会成为我们系统工作方式的一个组成部分.因此无缝工作非常重要.

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

解决方法:

在您的示例中定义名称空间的方式似乎是从每个名称空间中创建全局变量,因此您最终会使用

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() { ... };

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

标签:jquery,javascript,version-control,namespaces,project-management
来源: https://codeday.me/bug/20190613/1234545.html