为什么我不应该在JavaScript中使用全局变量来获得常量?

tes*_*ssr 3 javascript global-variables

我听说JavaScript中的全局变量很糟糕,我可以理解一些命名空间问题等等.但是为什么我不应该使用全局变量来处理整个脚本中永远不会改变的东西 - 比如日期?(当然,这种情况每天都在变化,但只会在整个脚本中被引用而不会被更改.)

jfr*_*d00 7

如果它们受到您认为是唯一命名空间的保护,并且仅在有益时使用,则可以使用全局变量.主要问题是全局变量可以使一段代码更容易与其他一些代码冲突(如果不使用不同的名称空间或非常独特的名称).出于这个原因和其他原因,最好在实际不需要全局变量时避免使用全局变量(当某些范围内声明的变量同样适用时),但仍有一些合适的理由可以使用全局变量.教育的主要观点是许多人在根本不需要时使用全局变量.如果您需要它们或发现它们更有效,那么只要您保护命名空间免受意外碰撞,就可以使用它们.

我个人创建了一个顶级的全局对象,并将所有其他全局变量挂起来.

全局变量的其他一些问题:

  1. 它们在Javascript中的访问速度比本地的慢,因为它们是最后发现的,因为解释器在它可能存在的各种范围中查找给定的变量名.通常不是一个明显的问题,但需要注意的事项.这是一个jsperf,显示了可以有多大差异.
  2. 如果您有任何异步代码修改全局变量或定时器驱动的代码来修改全局变量并且同时有多个异步操作可以在飞行中,则多个异步操作可以通过修改相同的全局变量来相互衔接.
  3. Globals通常不会在使用点附近声明,因此阅读代码可能更具挑战性.
  4. Globals通常不会在调试器中自动显示(局部变量的方式),使得调试不太方便.
  5. IE会根据DOM中的某些名称自动定义一堆全局变量,这些变量可能与您自己的全局变量冲突,而您却没有意识到这一点.
  6. 在局部变量上简单省略关键字"var"使其成为一个全局变量,如果该名称已被用作预期的全局变量,则可能会混淆代码.我以前见过这种情况发生在for (i = 0; i < m.length; i++)构造上.追踪错误可能很难.
  7. 全局变量在脚本的生命周期中持续存在.如果正在使用全局变量来保存脚本生命周期中不需要存在的对象的对象引用,则这可能导致脚本使用比其他情况更多的内存.
  8. 浏览器中的全局变量存在于window对象的范围内,因此它们不仅可以与其他全局变量冲突,还可以与窗口对象上的任何其他变量冲突.