6

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

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

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

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

有谁知道需要多个全局变量的实例?

4

5 回答 5

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 个全局变量。

于 2013-08-07T16:32:50.520 回答
0

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

0 全局变量在具有一流模块的 ES6 中是可能的。

于 2013-08-07T16:11:08.623 回答
0

我想说适用于 Javascript 以及任何其他语言的一般规则是尽量减少全局变量的情况。我确信在某些情况下需要多个全局变量,但通常应尽可能避免这种情况。在构建像 jQuery 这样的库时,您通常只需要公开该库功能的一个入口点。

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

于 2013-08-07T16:12:51.730 回答
0

我公开多个全局变量的唯一情况是应用程序将运行多个自身实例,每个实例都需要引用单个统一资源以供 onclick 回调使用。即使在那种情况下,只要付出一点额外的努力,我就可以将资源包含在应用程序中,并且不需要额外的全局。

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

于 2013-08-07T16:22:25.423 回答
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 应用程序,全局变量从来都不是必需的。

于 2013-08-07T16:39:05.857 回答