为什么从ECMAScript考虑中删除名称空间?

时间:2010-03-05 22:54:20

标签: javascript namespaces language-design ecma262

命名空间曾经是ECMAScript(旧的ECMAScript 4)的考虑因素,但已被取出。正如Brendan Eich在this message中所说:

  

其中一个名称空间的用例   ES4是早期绑定(使用命名空间   性能和   程序员理解 - 没有   运行时名称绑定的可能性   不同意任何先前的意见   捆绑。但任何早期约束   动态代码加载场景如   网络需要优先排序或   保留机制,以避免早期   与后期绑定冲突相比。

     

另外,正如一些JS实现者所拥有的那样   值得关注的是,多次开放   命名空间强加运行时成本,除非   实施工作
  更难。

     

出于这些原因,命名空间和   早期绑定(如之前的包裹   他们,今年四月)必须去。

但我不确定我是否理解这一切。什么是优先顺序或保留机制以及为什么需要这些机制?此外,早期绑定和名称空间必须齐头并进吗?出于某种原因,我无法解决所涉及的问题。任何人都可以尝试更充实的解释吗?

另外,为什么名称空间会占用运行时成本?在我看来,我不禁看到命名空间和使用闭包的函数之间的概念差别不大。例如,雅虎和谷歌都有YAHOO和谷歌对象“行为”名称空间,因为它们包含单个访问点内的所有公共和私有变量,函数和对象。那么,为什么命名空间在实现中会有如此显着的不同呢?也许我对命名空间的确切含义存在误解。

为了赏金,我想知道两件事:

  1. 命名空间是否需要早期绑定?
  2. 命名空间如何实现 不同于一个对象 私人会员?

2 个答案:

答案 0 :(得分:2)

如果在函数定义调用该变量后在闭包内声明变量,它仍然使用作用域变量。

function ShowMe() { 
    alert(myVar); //alerts "cool"
}

var myVar = "cool";

这个过程在命名空间方面会有另一层复杂。

除此之外,还有许多名称空间方法以及expand / applyIf等可以执行许多相同的功能。例如,ExtJS中的namespace()或jQuery中的$ .extend。因此,拥有它可能是一件好事,但在语言的结构中并不是绝对的需要。我认为正式化Array的一些扩展,并且在Date中支持ISO-8601日期本身就更为重要。不得不简单地检查每个命名空间层的定义......

window.localization = $.extend(window.localization || {}, {
  ...
});

window.localization.en = $.extend(window.localization.en || {}, {
  ...
});

答案 1 :(得分:1)

确定首先使用一些术语:

  • 早期绑定 - 在解析代码行时检查/验证。
  • 后期绑定 - 在执行代码行时检查/验证。
  • 优先级/保留 - 我认为它们意味着如果你进行早期绑定并检查名称空间,因为代码被解析,必须有一个进程来验证变量名称,以便稍后动态添加变量和另一组有效的规则,因为此时可能涉及多个范围。

我坦率地感到惊讶的是,只有这些非常技术性的原因才给出。以常见案例为例: -

onclick=' var mymark = "donethat";'

“mymark”应属于哪个命名空间?这个问题似乎没有任何简单的答案。特别是给出了代码片段: -

window.forms.myform.mybutton.onClick = ' var mymark = "donethat";'

应该将变量放在相同的名称空间中。