Javascript中的保留标识符';s全局命名空间
如果网页中嵌入的两个脚本需要通信,那么其中一个脚本需要某种全局状态,通常是一个全局变量。因此,尽管最小化全局状态的数量始终是一个好主意,但很少有人能在没有全局变量的情况下相处 选择一个与已经标准化的变量名不冲突的变量名很容易,比如我选择Javascript中的保留标识符';s全局命名空间,javascript,browser,Javascript,Browser,如果网页中嵌入的两个脚本需要通信,那么其中一个脚本需要某种全局状态,通常是一个全局变量。因此,尽管最小化全局状态的数量始终是一个好主意,但很少有人能在没有全局变量的情况下相处 选择一个与已经标准化的变量名不冲突的变量名很容易,比如我选择foo或foo。但是未来的兼容性呢?如果新的Web API或新的Ecmascript版本引入了foo函数或foo对象,会发生什么情况?当第三个脚本出现在需要新标准Foo对象的页面上时,它将崩溃,因为我的脚本用完全不同的内容覆盖了它 但是,即使页面上没有第三方脚本,
foo
或foo
。但是未来的兼容性呢?如果新的Web API或新的Ecmascript版本引入了foo
函数或foo
对象,会发生什么情况?当第三个脚本出现在需要新标准Foo
对象的页面上时,它将崩溃,因为我的脚本用完全不同的内容覆盖了它
但是,即使页面上没有第三方脚本,我的脚本也可能会遇到麻烦。假设我命名了一个全局变量onfoo
,以后的浏览器环境会在全局窗口对象上引入一个新事件foo
。每当新事件被触发时,我的全局对象onfoo
将被调用
因此,我的问题是在浏览器环境中是否有保留全局标识符的概念,或者某些名称是否被认为是安全的。那么我应该如何命名我的全局模块呢?其他名称空间(如自定义事件名称)也是如此 如果不选择使用模块管理库,则必须在以下选项中进行选择:
- 有意义的名称:易于观察和更好的维护,它们有冲突的风险(其他脚本或新关键字)
- 特别名称:
þf=þf |{}; þf.yÖ=þf.yÖ| |{}代码>
þf.yÖ
对象添加属性,因此在其中存储全局数据是安全的。看起来很可怕:)
毫无疑问,最好的方法是使用模块管理系统!
.如果必须使用全局变量,它最好是唯一的、有名称空间的。例如,
MarcFoo
。其他人不太可能取这个名字
因此,尽管最小化全局状态的数量始终是一个好主意,但很少有人能在没有全局变量的情况下相处
但是,可以编写代码,使全局变量名只出现在少数几个地方,如果确实需要,可以很容易地进行更改。(揭示)模块模式,甚至是全面的依赖关系管理,都有助于实现这一点
但是未来的兼容性呢
关于未来的事情是你不知道它。但是,您可以在web上搜索即将发布的标准草案,如EcmaScript 6或W3 HTML5提案。但是,可能有一些最佳做法可以减少冲突的可能性。正如您所检测到的,用开启
启动模块名称可能不是一个好主意
浏览器环境中是否有保留全局标识符的概念,或者某些名称是否被认为是安全的
()是一个很好的开始。它可能有点过时,也不详尽,但它很好地概述了您需要注意的事项
那么我应该如何命名我的全局模块呢?其他名称空间(如自定义事件名称)也是如此
始终为全局名称使用自定义且最好是唯一的前缀。这可以是您的项目或公司名称。您不必使用全局变量。您可以重写脚本以接受与之通信的“全局”对象。这使您可以灵活地更改通信通道。因此,虽然您的旧代码可能如下所示:
//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);
您的新代码如下所示:
//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
,而不是依赖窗口对象。为已发布的标准建立了“保留字”列表,ECMAScript第6版草案应包含任何其他保留字(如果有)。(W3C不控制ECMAScript,但它控制DOM API;这些DOM全局属性在技术上不是“保留标识符”。)相信我,未来的JavaScript版本不会有“foo”关键字。此外,将来的任何更改都可能是向后兼容的。您可以随时检查对象上是否已经设置了某个属性。我最喜欢的方法是像(“窗口中的位置”)这样检查位置是否是窗口中的键。通过这种方式,您可以检查是否使用了名称,并向后端提供备份和日志记录,以确定您的变量是否已使用。@BenjaminGruenbaum向后兼容,是的,但不一定与某人决定编写的内容兼容。@user2864740:我知道ECMAScript有许多重新保存的单词,但这些单词很少,列表不会有太大变化。但是,它们是语言的一部分,而不是全局对象的一部分。global
是在窗口对象上创建的,因此您仍然有一个全局变量,不是吗?您不必使用全局变量。如果将上面的代码包装到函数中,那么全局将是函数范围的。True,但不能将页面上的两个嵌入脚本包装到一个函数中(不合并脚本)。