Javascript中的多个全局变量

时间:2013-08-07 16:07:42

标签: javascript

这不是一个具体问题,而是一个更为理论化的问题。是否有充分理由为单个Javascript应用程序公开多个全局变量

我可以看到使用并经常使用我自己的单个全局变量来命名包含应用程序的对象或类,以便可以多次调用它(例如下面的例子),但我无法想到任何情况。其他全局变量不能被对象属性替换。

暴露变量使生活更轻松的示例(使用闭包,无法调用):

var myGlobalApp = {
    init: function (args) {...},
    methodOne: function () {...},
    methodTwo: function () {...},
    propertyOne: 'string for example'
};
myGlobalApp.init(arg1);
myGlobalApp.init(arg2);

是否有人知道需要多个全局变量的实例?

5 个答案:

答案 0 :(得分:4)

我认为拥有多个全局变量并不是绝对必要的 - JavaScript对象可以任意嵌套,并且通常可以像命名空间一样使用。

window.AwesomeModule = {
    app: {
        ...
    },
    util: {
        ...
    }
};

事实上,如果您的应用程序不能重复使用(即它只是面向用户),您可能不会泄漏任何全局变量。

(function() {
    var AwesomeModule = { ... };
    // Do whatever you want - create DOM nodes, bind to events, etc
    // Just don't bind anything to window
})();

一个更有趣的问题是,多个全局变量是否真的有用,我会说这取决于你的开发风格。例如,如果我们一般地看一下C#和.NET,我们可以看到整个框架(或多或少),命名空间和所有,都位于顶级命名空间System之下

当然,如果您要制作一个包含多个组件的巨大JavaScript应用程序,我绝对不会推荐这样的嵌套结构(除了可能不实用,JavaScript对象属性查找具有明确的运行时成本,这可能会添加向上)。

......无论如何,JavaScript的格局并没有得到很好的修剪。在空白页(运行Chrome)上,对我的计算机上的全局属性进行简单检查会产生约56项

var i = 0;
for (var prop in window) {
    if (window.hasOwnProperty(prop)) {
        i++;
    }
}

因此,虽然我们可以而且应该最小化我们自己的全局使用,但是现在的JS环境(特别是在使用外部库时)通常涉及全局变量。示例:StackOverflow总共有大约144个全局变量。

答案 1 :(得分:0)

通常,客户端Javascript的库每个至少有一个全局,因为要求用户使用模块库并不酷。

在ES6中有0个全局变量,具有一流的模块。

答案 2 :(得分:0)

我会说适用于Javascript的一般规则,对于任何其他语言来说,最小化全局变量的情况。我确信有些情况下需要多个全局变量,但通常应尽可能避免这种情况。在构建像jQuery这样的库时,通常只需要将一个入口点暴露给该库功能。

此外,全局变量会污染Javascript命名空间,这可能会导致与其他人的代码冲突。

答案 3 :(得分:0)

我暴露多个全局变量的唯一情况是应用程序将运行自身的多个实例,每个实例都需要引用单个统一资源以供onclick回调使用。即使在这种情况下,只需稍加努力,我就可以保留应用程序中包含的资源,而不需要额外的全局。

所以简而言之,在极少数情况下它是有用的/快速的&很脏,但从来没有必要。

答案 4 :(得分:0)

  

是否有人知道需要多个全局变量的实例?

全局变量从不必要,任何使用全局变量的JavaScript代码都可以重写,以便不会。

即使在您的示例中,全局变量也不是必需的,您可以改为使用自执行函数,如下所示:

(function(arg1, arg2) {
    var init = function (args) {...};
    var methodOne = function () {...};
    var methodTwo = function () {...};
    var propertyOne = 'string for example';

    init(arg1);
    init(arg2);
})(arg1, arg2);

显然,库通常会公开一个全局变量来使用该库,例如jQuery创建全局变量jQuery$。但对于单个JavaScript应用程序,全局变量永远不是必需的。