为什么全局变量被认为是不良做法?

时间:2012-05-09 23:31:51

标签: javascript global-variables global

我一直看到警告不要在JavaScript中使用全局变量,但似乎人们这么说的唯一原因是因为堵塞了全局命名空间。我可以想象通过将所有变量放入一个大对象中可以很容易地解决这个问题。现在的问题是:除了便利之外,还有其他理由不使用全局变量吗?它们是否涉及任何性能或兼容性问题?

7 个答案:

答案 0 :(得分:36)

它们使全局命名空间变得混乱,并且查找比局部变量更慢。

首先,拥有许多全局变量总是一件坏事,因为很容易忘记你在某个地方声明了一个变量并且意外地在其他地方重新声明了它。如果您的第一个变量是本地变量,那么您没有问题。如果它是全球性的,那么它就会被覆盖。当你进入隐含的全局变量时(例如,当你说someVar = someValue而没有用var关键字声明someVar时),情况会变得更糟。

其次,全局变量使Javascript“查找”的时间比局部变量要长。速度的差异并不大,但确实存在。

为了进一步阅读并更全面地解释为什么全局变形被视为不良行为,您可能需要查看this page

答案 1 :(得分:12)

全局变量可以显着增加耦合,显着降低代码的可伸缩性和可测试性。一旦开始使用全局变量,您现在必须知道变量的修改位置和方式(即打破封装)。大多数文献和惯例都会争辩说,在使用全局变量时,性能是您最不关心的问题。

这是导致头痛的fantastic article outlining why个全局变量。

答案 2 :(得分:5)

如果您的脚本很长并且您使用来自许多函数的这些变量,则会增加您的调试时间,因为全局变量的值可能已从任何位置更改,因此如果您正在跟踪此更改为非预期的位置你需要检查它们的价值。

如果不同的程序员从页面中包含的其他脚本修改此变量,则此方案会更加痛苦。

答案 3 :(得分:4)

简而言之,全局变量会导致(以及更多)以下问题。

1)变量命名冲突 - 如果您正在一个团队工作,并且您自己和您的同事在全局范围内使用相同的变量名称,则最后定义的变量将覆盖初始变量。这显然会产生毁灭性的后果。

2)安全性 - 特别是在Web上,每个用户都可以访问Window(或全局)对象。通过将变量放在全局范围内,您可以让任何用户查看或更改变量。

3)较慢 - 这可以说是微不足道的,但它仍然存在。 JavaScript变量查找的工作方式是JavaScript引擎将查找当前查找变量的范围。如果找不到它,它将查找下一个父范围。如果它没有找到它,它将继续向上看,直到它到达寻找该变量的全局对象。如果所有变量都位于全局范围内,则JavaScript引擎将始终必须遍历每个范围,以便最终到达全局范围以查找变量。

答案 4 :(得分:3)

在代码中使用全局变量应该没有任何问题,只要将它们包装在uniqe namespase / object中(以避免与不属于你的脚本冲突)

在javascript中使用全局变量有一个优点,它源于javascript不是强类型语言的事实。因为,如果你将一些复杂的对象作为参数传递给一个函数,那么你可能会失去对那些对象(在函数范围内)的所有智能,而在使用全局对象时,将会保留这些对象。当你有智慧时,它实际上可以改善调试时间(与其他人所说的相反......)

我个人认为这非常有用,而且肯定会出现在我的代码中。

(当然,人们应该在本地和全局变量之间取得适当的平衡)

答案 5 :(得分:1)

基本上,因为可以从页面上的任何脚本访问它们,因为您可以在同一范围内重复它的名称。这就是许多Javascript引擎使用此代码的原因:

(function(){
    var foo = 'foo',//Local
    bar = 'bar';//Local
    window.globalVar = foo + bar;//Global
})();
alert(foo);//Error
alert(bar);//Error
alert(globalVar );//'foobar'

答案 6 :(得分:0)

您创建的全局变量可能会覆盖现有的窗口对象属性。因为全局变量是在全局上下文(即窗口对象)中访问的。