如果网页中嵌入的两个脚本需要进行通信,则需要某种全局状态,通常是全局变量。因此,尽管最小化全局状态的数量总是一个好主意,但很少有人没有全局变量。
很容易选择一个不会与已经标准化的内容发生冲突的变量名称,比如我选择foo
或Foo
。但未来的兼容性又如何呢?如果新的Web API或新的Ecmascript版本引入了foo
函数或Foo
对象,会发生什么?当第三个脚本位于需要新标准Foo
对象的页面上时,它会崩溃,因为我的脚本已经用完全不同的东西覆盖了它。
但即使页面上没有第三方脚本,我的脚本也可能遇到麻烦。假设我已经命名了一个全局变量onfoo
,后来的浏览器环境在全局窗口对象上引入了一个新事件foo
。每当触发新事件时,我的全局对象onfoo
将被调用...
因此,我的问题是浏览器环境中是否存在保留全局标识符的概念,或者某些名称是否被认为是安全的。那么我应该如何命名我的全局模块呢?自定义事件名称等其他命名空间也是如此。
答案 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 names(1)是一个非常好的开始。它可能有点过时而不是详尽无遗,但可以很好地概述您需要注意的事项。
那么我应该如何命名我的全局模块?其他命名空间也是如此,例如自定义事件名称。
始终为全局名称使用自定义且最好是唯一的前缀。这可以是您的项目或公司名称。
答案 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
。其他任何人都不太可能使用这个名字。