命名空间曾经是ECMAScript(旧的ECMAScript 4)的考虑因素,但已被取出。正如Brendan Eich在this message中所说:
其中一个名称空间的用例 ES4是早期绑定(使用命名空间 性能和 程序员理解 - 没有 运行时名称绑定的可能性 不同意任何先前的意见 捆绑。但任何早期约束 动态代码加载场景如 网络需要优先排序或 保留机制,以避免早期 与后期绑定冲突相比。
另外,正如一些JS实现者所拥有的那样 值得关注的是,多次开放 命名空间强加运行时成本,除非 实施工作
更难。出于这些原因,命名空间和 早期绑定(如之前的包裹 他们,今年四月)必须去。
但我不确定我是否理解这一切。什么是优先顺序或保留机制以及为什么需要这些机制?此外,早期绑定和名称空间必须齐头并进吗?出于某种原因,我无法解决所涉及的问题。任何人都可以尝试更充实的解释吗?
另外,为什么名称空间会占用运行时成本?在我看来,我不禁看到命名空间和使用闭包的函数之间的概念差别不大。例如,雅虎和谷歌都有YAHOO和谷歌对象“行为”名称空间,因为它们包含单个访问点内的所有公共和私有变量,函数和对象。那么,为什么命名空间在实现中会有如此显着的不同呢?也许我对命名空间的确切含义存在误解。
为了赏金,我想知道两件事:
答案 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";'
应该将变量放在相同的名称空间中。