很抱歉这么说,但您收到的答案是您应该远离的坏习惯。 A更好的编程实践,也许还有proper编程实践中,将是对全局变量进行伪命名空间,以免弄乱全局命名空间/范围。其背后的原因是为了让您的代码更易于管理,更重要的是,如果/当您的应用程序变得很大时,让您的生活更轻松。定义命名空间的一个简单机制是使用因 Douglas Crockford 而闻名的模块模式。
这是一个简单的例子:
var myNamespace = function(){
var o = {};
var globals = {};
var setGlobVar = function(name, value) {
globals[name] = value;
};
var getGlobVar = function(name) {
if (globals.hasOwnProperty(name)) {
return globals[name];
} else {
// return null by default if the property does not exist
return null;
}
};
o.setGlobVar = setGlobVar;
o.getGlobVar = getGlobVar;
return o;
}();
要使用它,您只需像调用对象的方法一样调用它即可。
myNamespace.setGlobVar("secret_msg", "Dumbledore dies, so does Hedwig");
myNamespace.getGlobVar("secret_msg");
您还可以暴露globals
变量而不是使用setGlobVar
and getGlobVar
如果您想简化访问变量的方式,请使用它的方法。
重点是远离在全局命名空间中定义变量(即window
对象),通过创建您自己的命名空间来尽可能多地使用。这减少了名称冲突、意外重写或覆盖以及全局命名空间混乱的可能性。
执行此操作的一种更简单的方法是简单地定义一个对象并增强其属性。
var globals = {};
globals.SECRET_MSG = "Snape is not a traitor"
虽然我会通过包装来扩展这种方法globals
进入特定于我的应用程序的命名空间。
var myNamespace = {};
myNamespace.globals = {};
myNamespace.globals.SECRET_MSG = "Snape is not a traitor"
注意:这实际上与我建议的原始模块模式方法相同,只是没有get
and set
访问器方法和编码不同。