40

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

4

7 回答 7

44

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

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

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

要进一步阅读和更深入地解释为什么全局变量被认为是不好的做法,您可能需要查看此页面

于 2012-05-09T23:34:06.590 回答
15

全局变量可以显着增加耦合,显着降低代码的可扩展性和可测试性。一旦开始使用全局变量,您现在必须知道变量在何处以及如何被修改(即破坏封装)。大多数文献和惯例都认为,在使用全局变量时,性能是您最不关心的问题。

这是一篇很棒的文章,概述了为什么全局变量会引起头痛。

于 2014-07-24T20:55:25.563 回答
7

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

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

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

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

于 2015-05-24T01:26:50.043 回答
5

如果您的脚本很长并且您从许多函数中使用这些变量,它将增加您的调试时间,因为全局变量的值可能已从任何地方更改,因此如果您正在跟踪更改为非预期值的位置,您'必须全部检查。

如果不同的程序员从您页面中包含的其他脚本修改此变量,这种情况会更加痛苦。

于 2012-05-09T23:39:21.310 回答
3

只要您将全局变量包装在唯一的命名空间/对象中(以避免与不属于您的脚本发生冲突),在您的代码中使用全局变量应该不会有任何问题

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

我个人觉得这非常有用,它肯定在我的代码中占有一席之地。

(当然,应该始终在局部变量和全局变量之间做出正确的平衡)

于 2012-07-17T07:17:10.060 回答
1

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

(function(){
    var foo = 'foo',//Local
    bar = 'bar';//Local
    window.globalVar = foo + bar;//Global
})();
alert(foo);//Error
alert(bar);//Error
alert(globalVar );//'foobar'
于 2012-05-09T23:34:44.807 回答
0

The global variable which you have created might overwrite the existing window object properties. Because the global variables are accessing in global context i.e. window object.

于 2018-10-06T17:43:28.377 回答