繁体   English   中英

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

[英]Why shouldn't I use global variables in JavaScript for something that's constant?

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

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

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

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

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

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

您不应该在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关键字引起的错误很难捕获

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM