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

IT技术 javascript global-variables global
2021-01-20 16:21:06

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

6个回答

它们弄乱了全局命名空间,并且查找速度比局部变量慢。

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

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

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

如果你重新声明它,你会得到一个编译器错误。但我知道你的意思,你的意思是如果你在错误的地方重用它,你的代码很容易失败,你会对出错的地方感到困惑。
2021-03-14 16:21:06

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

这是一篇很棒的文章,概述了为什么全局变量会让人头疼。

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

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

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

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

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

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

更难的调试只是全局变量不好的原因之一。其他列在为什么全局变量如此邪恶
2021-03-29 16:21:06

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

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

我个人认为这非常有用,并且在我的代码中肯定占有一席之地。

(当然,应该始终在局部变量和全局变量之间取得适当的平衡)