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

时间:2011-08-08 23:45:44

标签: javascript global-variables

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

3 个答案:

答案 0 :(得分:7)

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

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

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

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

答案 1 :(得分:2)

最大的答案是命名空间问题。如果您包含另一个使用相同变量名称的脚本,则会产生不需要的副作用。如果您可以确保将来不会在该页面上包含其他脚本,那么对您来说这不是一个特别的问题。

答案 2 :(得分:0)

您不应该在javascript中使用全局变量,因为可能与其他脚本冲突。例如,您正在编写jQuery插件。您的全局变量可能会覆盖另一个脚本中的全局变量。

因此,要将此可重写可能性降至最小,您应该只使用一个全局变量。如果你使用jQuery,你根本不应该使用全局变量。您可以扩展全局$对象。 例如:

$.extend({
    something: your_app_variable
});

如果使用纯JavaScript,则应使用命名空间问题。为您的应用程序只创建一个全局变量。所有其他变量将只是此全局变量的属性。 例如:

// if APP doesn't exist creating it
APP = APP || {};
APP.some_method = function(){}
APP.some_property = 3;

UPD:请记住,您应该使用var声明变量。除非声明的变量是全局的。忘记var关键字导致的错误很难识别