创建 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
edit:
以下是我们解决这个问题的方法:
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() { ... };
这样您就不必引入新的全局变量,并且可以放心地添加到现有的命名空间,而不会破坏其中的其他对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)