Javascript-命名空间嵌套是否存在任何硬性限制(或性能影响)

Javascript - is there any hard limit (or performance impact) for namespace nesting?

本文关键字:性能 影响 嵌套 命名空间 是否 存在 任何硬 Javascript-      更新时间:2023-09-26

除了典型的var x = function(){...}构造之外,我还想了解更多关于Javascript的信息,所以我选择了名称空间。

在PHP中,我总是使用名称空间来避免冲突,并组织我的常量、类和函数。到目前为止,我已经完成了基本的命名如下:

var helpers = {
    strings: {
        add: function(a, b) {
            alert(a + ' plus ' + b + ' equals to ' + (a + b));
        },
        msgbox: function(text) {
            alert(text);
        }
    }
}

所以我可以写这样的HTML块:

<button class="ui-button" type="button" onclick="helpers.strings.msgbox('Hello, world!');"><img src="assets/images/alert.png" alt="Alert">&nbsp;Click me!</button>

我的问题是:

  • 我可以在其中嵌套名称空间的级别数量有什么实际/严格的限制吗
  • 任何给定函数的嵌套级别是否会对性能产生影响
  • 我可以稍后扩展给定的命名空间吗?喜欢拥有一个core.js文件并扩展strings命名空间,以便在extended.js中添加更多函数

我不打算构建一个可怕的嵌套结构或类似的东西,但我只想知道浏览器引擎或语言本身是否有任何实际限制,所以我的问题更多的是理论性质的(在这种情况下,我不会构建一个结构来测试这一点)。

我可以嵌套的级别数量有实际的/硬性的限制吗我的命名空间在里面?

显然,这是因为如果没有其他限制,那么更多的级别将需要更多的内存,而内存是有限的,而且在实践中,还会有其他限制(源自每个特定JavaScript引擎的实现细节)。

实用的答案是:如果你有理由相信你可能会接近这些极限,那你就做错了。

嵌套级别是否会对性能产生影响对于任何给定的函数?

是的,因为每个间接级别都涉及到查找下一个嵌套的"命名空间"对象在内存中的位置,并查找其属性。在实践中,与您的代码将要做的其他事情相比,这种成本是无穷小的,因此您将无法测量任何差异,除非级别的数量很大,并且您正在循环中挖掘嵌套值。

例如,这不是最好的想法:

for(var i = 0; i < 1000000000; ++i) {
    ns1.ns2.ns3.ns4.ns5.ns6.ns7.ns8.ns9.ns10.ns11.ns12.ns13.count += 1;
}

幸运的是,如果你需要这样做,有一个简单的解决方法:

var ns13 = ns1.ns2.ns3.ns4.ns5.ns6.ns7.ns8.ns9.ns10.ns11.ns12.ns13;
for(var i = 0; i < 1000000000; ++i) {
    ns13.count += 1;
}

我可以稍后扩展给定的命名空间吗?喜欢拥有核心.js文件并扩展字符串命名空间以在中添加更多函数,比方说,extended.js?

您可以,但必须小心,以便这两个文件都使用一种将变量注入命名空间的机制,该机制实际上不会替换命名空间的内容。

由于这是另一次查找,因此每一级嵌套的性能都会受到轻微影响。如果这是用于客户端脚本,那么下载更多代码会带来额外的开销。第一个可能很小。第二,你必须自己决定。

稍后,您可以轻松地将新函数添加到名称空间中:

helpers.strings.multiply = function(a, b) { /* ... 8/}

尽管多年来我一直在大量使用名称空间,但现在我很少这样做了,我更喜欢模块加载系统来管理我的依赖关系,甚至不公开像helper这样的东西。但是如果你选择这样做,这些类型的名称空间很容易创建和使用