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

Bob*_*Bob 7 javascript namespaces language-design ecma262

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

ES4中名称空间的一个用例是早期绑定(使用命名空间内在),无论是性能还是程序员理解 - 运行时名称绑定都不会与任何早期绑定不一致.但是,在任何动态代码加载方案(如Web)中的早期绑定需要使用优先级或预留机制来避免早期与晚期绑定冲突.

此外,正如一些JS实现者关注的那样,多个开放
命名空间会强加运行时成本,除非实现工作
更加困难.

由于这些原因,名称空间和早期绑定(比如
它们之前的包,今年四月)必须去.

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

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

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

  1. 命名空间是否需要早期绑定?
  2. 命名空间实现与具有私有成员的对象有何不同?

Tra*_*er1 2

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

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

var myVar = "cool";
Run Code Online (Sandbox Code Playgroud)

这个过程在命名空间方面会变得更加复杂。

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

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

window.localization.en = $.extend(window.localization.en || {}, {
  ...
});
Run Code Online (Sandbox Code Playgroud)