在javascript中定义全局函数有什么缺点吗?

时间:2014-10-13 14:05:51

标签: javascript

定义全局函数是否有任何特定的缺点,因为定义全局变量? 我们正在尝试缩小我们的自定义JS文件,并且在功能上使用了相当多的代码。

3 个答案:

答案 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; //一年多!