Javascript全局命名空间中的保留标识符

时间:2014-03-13 08:39:56

标签: javascript browser

如果网页中嵌入的两个脚本需要进行通信,则需要某种全局状态,通常是全局变量。因此,尽管最小化全局状态的数量总是一个好主意,但很少有人没有全局变量。

很容易选择一个不会与已经标准化的内容发生冲突的变量名称,比如我选择fooFoo。但未来的兼容性又如何呢?如果新的Web API或新的Ecmascript版本引入了foo函数或Foo对象,会发生什么?当第三个脚本位于需要新标准Foo对象的页面上时,它会崩溃,因为我的脚本已经用完全不同的东西覆盖了它。

但即使页面上没有第三方脚本,我的脚本也可能遇到麻烦。假设我已经命名了一个全局变量onfoo,后来的浏览器环境在全局窗口对象上引入了一个新事件foo。每当触发新事件时,我的全局对象onfoo将被调用...

因此,我的问题是浏览器环境中是否存在保留全局标识符的概念,或者某些名称是否被认为是安全的。那么我应该如何命名我的全局模块呢?自定义事件名称等其他命名空间也是如此。

4 个答案:

答案 0 :(得分:1)

如果使用模块管理库不是一个选项,您必须选择:

  • 有意义的名称:易于识别并且更易于维护,它们存在碰撞风险(其他脚本或新关键字)

  • 特殊名称:

    þf = þf || {}; þf.yÖ = þf.yÖ || {};

没有人会向þf.yÖ对象添加属性,因此将全局数据存储在其中是安全的。它看起来很糟糕:))

最好的方法是毫无疑问地使用模块管理系统! This just adds the 'define' global object IIRC

答案 1 :(得分:1)

  

因此,尽管最小化全局状态的数量总是一个好主意,但很少有人没有全局变量。

但是,人们可以编写代码,以便全局变量名只出现在少数几个地方,如果真的有必要,可以轻松更改。 (揭示)模块模式甚至是完整的依赖管理都有助于此。

  

但未来的兼容性如何?

关于未来的事情是你不了解它。但是,您可以在网上搜索即将推出的标准草稿,例如EcmaScript 6或W3 HTML5提案。但是,可能存在一些降低冲突概率的最佳实践。如您所检测到的,使用on启动模块名称可能不是一个好主意。

  

浏览器环境中是否存在保留全局标识符的概念,或者某些名称是否被认为是安全的。

Unsafe names1)是一个非常好的开始。它可能有点过时而不是详尽无遗,但可以很好地概述您需要注意的事项。

  

那么我应该如何命名我的全局模块?其他命名空间也是如此,例如自定义事件名称。

始终为全局名称使用自定义且最好是唯一的前缀。这可以是您的项目或公司名称。

答案 2 :(得分:0)

您不必使用全局变量。您可以重写脚本以接受与之通信的“全局”对象。这使您可以灵活地更改通信渠道。因此,虽然您的旧代码可能如下所示:

//script1
(function(){
   foo.message = "bar";
   // ...
})();

//script2
(function(){
   alert(foo.message);
   // ...
})();

您的新代码如下所示:

var global={};
//script1
(function(foo){
   foo.message = "bar";
   // ...
})(global);

//script2
(function(foo){
   alert(foo.message);
   // ...
})(global);

显式传入您的通讯渠道global,而不是依赖于窗口对象。

答案 3 :(得分:-1)

如果必须使用全局变量,它最好是唯一的和命名空间的。例如,MarcFoo。其他任何人都不太可能使用这个名字。