0

除了典型的结构之外,我正在尝试更多地了解 Javascript var x = function(){...},所以我选择了命名空间。

在 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

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

4

2 回答 2

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?

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

于 2013-08-19T18:58:23.440 回答
1

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

以后您可以轻松地将新功能添加到您的命名空间:

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

尽管多年来我大量使用命名空间,但我现在很少这样做,我更喜欢模块加载系统来管理我的依赖关系,甚至不暴露helper. 但是,如果您选择这样做,这些类型的命名空间很容易创建和使用。

于 2013-08-19T19:00:51.710 回答