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

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

他们混淆了全局名称空间,比查找局部变量要慢。

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

其次,全局变量需要更长的时间才能找到比本地变量更好的Javascript。 速度的差异并不大,但确实存在。

要进一步阅读和更深入的解释为什么globals被认为是不好的做法,你可能想看看这个页面 。

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

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

如果你的脚本很长,并且你使用了很多函数中的这些变量,那么它会增加你的调试时间,因为全局变量的值可能已经从任何地方改变了,所以如果你正在追踪这个变化到非预期的值,必须全部检查。

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

在你的代码中使用全局变量不应该有任何问题,只要你把它们包装在uniqe namespase / object中(为了避免与不是你自己的脚本冲突)

在JavaScript中有一个使用全局变量的冒险,它源于JavaScript不是强类型语言的事实。 因此,如果将某些复杂对象作为参数传递给某个函数,那么在使用全局对象的同时,将会失去对这些对象(在函数作用域内)的所有intellisence,将保留该intellisence。 当你有智慧时,它实际上可以提高调试时间(与其他人所说的相反)

我个人觉得非常有用,而且在我的代码中也有一席之地。

(当然,还是应该在当地人和全局变量之间做出正确的平衡)

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

1)变量命名冲突 – 如果你在一个团队中工作,你和你的同事在全局范围上使用相同的变量名,最后定义的变量将覆盖初始变量。 这显而易见的后果可能是毁灭性的。

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

3)更慢 – 这可以忽略不计,但它仍然存在。 JavaScript变量查找的工作方式是JavaScript引擎将查找变量正在查找的当前范围。如果找不到,它将查找下一个父范围。 如果它没有找到它,它将继续向上看,直到它到达寻找该变量的全局对象。 如果所有变量都位于全局范围内,那么JavaScript引擎将总是要遍历每个范围,以便最终到达全局范围以查找变量。

基本上,因为他们可以从页面上的任何脚本访问,因为你可以在相同的范围内重复它的名字。 这就是为什么很多Javascript引擎使用这个代码:

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