7

命名空间曾经是 ECMAScript(旧的 ECMAScript 4)的考虑因素,但后来被取消了。正如 Brendan Eich 在此消息中所说:

ES4 中命名空间的用例之一是早期绑定(使用内部命名空间),无论是为了性能还是为了程序员的理解——运行时名称绑定不可能与任何早期绑定不一致。但是在任何动态代码加载场景(如 Web)中的早期绑定都需要优先级或保留机制,以避免早期与晚期绑定冲突。

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

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

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

另外,为什么命名空间会带来运行时成本?在我看来,我不禁看到命名空间和使用闭包的函数在概念上几乎没有区别。例如,Yahoo 和 Google 都有 YAHOO 和 google 对象,它们“行为类似于”命名空间,因为它们在单个访问点中包含所有公共和私有变量、函数和对象。那么,为什么命名空间在实现上会有如此显着的不同呢?也许我只是对命名空间的确切含义有一个误解。

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

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

2 回答 2

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 || {}, {
  ...
});
于 2010-03-09T00:18:14.470 回答
1

先确定一些术语:

  • 早期绑定——在解析代码行时检查/验证。
  • 后期绑定——执行代码行时检查/验证。
  • 优先级/保留 - 我认为它们的意思是,如果您进行早期绑定并在解析代码时检查名称空间,那么当稍后动态添加变量时,必须有一个过程来验证变量名称,并有一套不同的规则来说明什么是有效的,因为此时可能涉及多个范围。

坦率地说,我很惊讶只给出了这些相当技术性的原因。以常见情况为例:-

onclick=' var mymark = "donethat";'

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

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

应该把变量放在同一个名字空间。

于 2010-03-23T07:20:28.110 回答