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

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

本文关键字:全局变量 常量 不应该 JavaScript 为什么      更新时间:2023-09-26

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

如果全局变量在您认为唯一的命名空间中受到保护,并且只在有益的时候使用,则可以使用全局变量。主要问题是,全局变量可能使一段代码更有可能与其他代码段发生冲突(如果不使用不同的名称空间或非常独特的名称)。由于这个原因和其他原因,最好在实际上不需要全局变量时避免使用全局变量(在某些作用域内声明为局部的变量也可以工作),但是仍然有一些适当的理由使用全局变量。教育的要点是,许多人在根本不需要全局变量时使用全局变量。如果你需要它们或者发现它们更有效,那么你可以很好地使用它们,只要你保护命名空间免受意外冲突。

我个人创建了一个顶层全局对象,并将所有其他全局对象挂在该对象上。

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

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

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

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

因此,为了将这种可重写的可能性降低到最小,您应该只使用一个全局变量。如果使用jQuery,就不应该使用全局变量。你可以扩展全局$ object。例如:

$.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关键字导致的错误难以捕获