Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript中的保留标识符';s全局命名空间_Javascript_Browser - Fatal编程技术网

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,但不能将页面上的两个嵌入脚本包装到一个函数中(不合并脚本)。