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

时间:2013-08-19 18:48:52

标签: javascript performance namespaces limit

除了典型的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

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

2 个答案:

答案 0 :(得分:1)

  

我可以嵌套的级别数是否有任何实际/硬性限制   我的名字空间在哪里?

显然,因为如果没有其他更多级别需要更多内存且内存是有限的,并且在实践中还会有其他限制(从每个特定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;
}
  

我可以及时扩展给定的命名空间吗?就像......有一个core.js   文件和扩展字符串命名空间以添加更多功能,   让我们说,extended.js?

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

答案 1 :(得分:1)

每个嵌套级别都会有轻微的性能损失,因为它是另一个查找。如果这是用于客户端脚本,那么下载更多代码会产生额外的开销。第一个可能很小。第二个你必须自己决定。

您可以在以后轻松地向命名空间添加新功能:

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

虽然我多年来大量使用命名空间,但我现在很少这样做,更喜欢使用模块加载系统来管理我的依赖关系,而不是像helper那样暴露。但是,如果您选择这样做,这些命名空间很容易创建并且易于使用。