【问题标题】:Why were namespaces removed from ECMAScript consideration?为什么命名空间从 ECMAScript 考虑中移除?
【发布时间】:2011-01-24 08:01:30
【问题描述】:

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

命名空间的用例之一 ES4 是早期绑定(使用命名空间 内在),无论是性能和 对于程序员的理解——没有 运行时名称绑定的机会 不同意之前的任何 捆绑。但在任何早期绑定 动态代码加载场景,如 网络需要优先级或 提前预约机制 与后期绑定冲突。

另外,正如一些 JS 实现者所拥有的那样 关切地注意到,多个开放
命名空间强加运行时成本,除非 实施工作
明显更难。

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

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

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

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

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

【问题讨论】:

    标签: javascript namespaces language-design ecma262


    【解决方案1】:

    先确定一些术语:

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

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

    onclick=' var mymark = "donethat";'
    

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

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

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

    【讨论】:

      【解决方案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 || {}, {
        ...
      });

      【讨论】:

      • 我也觉得还有更重要的事情要集中精力,但我问这个是因为我不明白给出的理由。在这里你也给出了 ECMAScript 中命名空间模拟的例子,所以我更困惑为什么命名空间是一个坏主意
      猜你喜欢
      • 1970-01-01
      • 2017-05-05
      • 2021-11-09
      • 1970-01-01
      • 2019-02-09
      • 2012-07-05
      • 2017-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多