Javascript情况,声明一个全局变量是好的吗?

时间:2014-05-20 21:48:40

标签: javascript global-variables

GOOD 何时在JavaScript中声明全局变量?关于全局变量的典型建议包括:

我有时会遇到这样的情况:变量的值在用户活动期间是可用的。例如,知道哪个页面处于打开状态。另一种情况是,当一个漫长的过程具有许多较小的功能时,但在整个过程中需要保持一些价值。不是将参数从函数传递到函数,而是希望它不会混淆,只需创建一个全局变量。

  • 一般来说,声明全局变量是不好的做法。
  • 可能会导致"命名空间污染"。
  • 出现问题
  • 在函数内部和外部复制相同名称的变量声明。
  • 全局变量的查找速度比局部变量慢。
  • 您很容易忘记您已声明全局变量,因为它与您正在处理的当前代码的网站不同。
  • 跟踪和调试全局变量很难。
  • 异步使用全局变量可能会导致并发问题。

声明全局变量的情况好吗?

  • 包含很多字符的常量,经常使用。减少整体代码的大小。
  • 保存必须监控的某些内容的当前状态,并始终可用于多个功能。

在我看来,要求是:

  • 高使用率和/或
  • 至少有两个不同的功能在彼此范围之外。

示例:

具有多个字符的对象:

var dc = document;
var isTheMenuDisplayed = dc.getElementById('MainMenu').style.display;

监控当前状态:

当前显示的页面:

/* The state of what page is currently display, must be available to
  the entire application at all times.
  Variable is declared outside of a function enclosure.
*/

var whichPageDisplayed = '';

function changePage(pageNameToOpen) {
  if (whichPageDisplayed === 'home') {
    close the home page;
    open the new page;
    //Make sure to record what the new current open page is
    whichPageDisplayed = pageNameToOpen;
};

我正在寻找有关何时 GOOD 使用全局变量的原因。

如果全局变量总是被认为是坏的,那么如何在没有全局变量的情况下处理上述两种情况呢?

"全局变量的异步使用可能会导致并发问题"理由不应该是全局变量的专有。异步使用任何东西都可能导致并发问题,所以我不知道这是一个反对全局变量的参数。

"很容易忘记你宣布了全局变量,因为它是你正在处理的当前代码的网站之外"理由似乎是一个编码学科问题。如果我看到在该部分代码中找不到任何var = thisVar语句,我会自己思考,"也许我将其声明为全局变量?"。然后我会进行搜索以找到它。

"跟踪和调试全局变量很难"我有一个"搜索所有文件"我的代码编辑器中的选项。它搜索所有文件,并向我显示搜索找到匹配的每行代码。这并不难。根据我使用的浏览器和开发人员工具,错误消息可能会向我显示错误来自的确切代码行。

1 个答案:

答案 0 :(得分:2)

减少整体代码大小并不是一个正当理由。 Minifiers将击倒它。此外,如果您有类似dc.getElementById('MainMenu').style.display的示例,则需要方法来帮助您。例如getDisplayStyle('MainMenu')。这样做只是一种很好的做法,因为它可以让你将逻辑保持在一个位置。

保存状态也不是一个有效的理由。将代码保存在模块中。例如,您的代码变成了一些更好的":

PageState = {
    changePage: function (pageNameToOpen) {
        if(this._currentPage == 'home') {
        /*******/
        }
        this._currentPage = pageNameToOpen;
    },
    getCurrentPage: function () {
        return this._currentPage;
    }
};
PageState.changePage(pageNameToOpen);

您应该考虑全局变量的唯一情况是库是否需要它,或者您是否需要在此之前设置配置选项"某些事情"存在(并且您没有使用AMD类型模块)。例如,其中一个流行的WYSIWYG编辑器专门针对定义一些常量设置的全局变量。

基本上,对于几乎所有可能的全局变量用法,都有一个反对论证,可以将它包装在某种模块中。