微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

One of the use-cases for namespaces in
ES4 was early binding (use namespace
intrinsic),both for performance and
for programmer comprehension — no
chance of runtime name binding
disagreeing with any earlier
binding. But early binding in any
dynamic code loading scenario like
the web requires a prioritization or
reservation mechanism to avoid early
versus late binding conflicts.

Plus,as some JS implementors have
noted with concern,multiple open
namespaces impose runtime cost unless
an implementation works
significantly harder.

For these reasons,namespaces and
early binding (like packages before
them,this past April) must go.

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

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

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

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

解决方法

如果在函数定义调用该变量后在闭包内声明变量,它仍然使用作用域变量.
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 || {},{
  ...
});

原文地址:https://www.jb51.cc/js/157073.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐