在创建 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/