定义全局函数是否有任何特定的缺点,因为定义全局变量? 我们正在尝试缩小我们的自定义JS文件,并且在功能上使用了相当多的代码。
答案 0 :(得分:0)
命名空间冲突是一个大问题。如果您创建一个全局函数,并且意外地使用与另一个全局函数相同的名称,您将覆盖该函数,这可能会导致应用程序中断。
请记住,所有全局变量实际上都是window
对象的属性。如果您不小心覆盖了window
的内置属性,则可能会产生一些非常奇怪的故障,这些故障很难被追踪。
另一个原因是一般的清洁/组织。如果你编写了十几个函数来对字符串进行操作,你可能希望将它们全部放在一个对象stringOps
上,这样你就可以将它们放在一个地方。
答案 1 :(得分:0)
全球参考的主要危险是你会踩到别人的参考,反之亦然。这可能会使测试非常困难,因为您可能已经引入了大剂量的非确定性。 例如,你说你将Global.PI定义为3.14159,并且你的函数可以正常工作,直到用户加载一个带有将Global.PI定义为'Lemon'的库的页面,现在你的函数工作效果不尽如人意。
由于我们的应用程序的结构,我工作的项目具有全局引用。 为了缓解这些问题,我们将一个对象附加到window(window.yourObjHere)并将我们的全局引用放在该对象中。
Globals的唯一优势是,如果没有它们,有些事情是无法完成的。我们有一个必须在单独的AngularJS应用程序上发送消息的eventBus。由于AngularJS本机eventBus是每个应用程序,我们必须在我们的GLobal对象上注册每个应用程序,以便跟踪消息应该去哪里等。尽可能避免使用Globals,但是只有一些事情在没有它们的情况下无法完成。请小心并限制您的全球足迹。
答案 2 :(得分:0)
缺点是概括性的(基本上没有命名空间意味着函数/变量可以被覆盖)但是你可以通过声明一个全局对象来解决这个问题,这个对象具有你需要的所有东西 - 你可以在它上面添加东西苍蝇':
GLOBAL_myObject = {
variableOne: 1,
variableTwo: "A atring",
getThisAndThat: function(p1,p2) {
//do some stuff
return p1 * p2; /or somthing
}
};
因此,请将您自己的所有变量称为该对象的属性:
alert(GLOBAL_myObject.variableOne);
GLOBAL_myObject.getThisAndThat(1,2);
实际上,你只是命名空间变量。
要向全局GLOBAL_myObject添加更多内容,您只需声明它..
GLOBAL_myObject.anotherThing = 1965; //一年多!