Javascript中的多个全局变量

Javascript中的多个全局变量,javascript,Javascript,这不是一个具体的问题,而是一个更具理论性的问题。是否有充分的理由为单个Javascript应用程序公开多个全局变量 我可以看到使用一个全局变量来命名一个包含应用程序的对象或类,这样它就可以被多次调用(下面的例子),但我想不出有任何情况下,任何其他全局变量都不能被对象属性替换 示例:暴露的变量使生活更轻松(使用闭包,无法调用): 有人知道需要多个全局变量的实例吗?客户端Javascript库通常至少使用一个全局变量,因为要求用户使用模块库并不酷 在具有一流模块的ES6中,0全局变量是可能的。我想说

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

我可以看到使用一个全局变量来命名一个包含应用程序的对象或类,这样它就可以被多次调用(下面的例子),但我想不出有任何情况下,任何其他全局变量都不能被对象属性替换

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


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

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


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

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


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

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

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

我不认为有多个全局变量是绝对必要的-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
})();
一个更有趣的问题是,拥有多个global是否真的有用,我认为这取决于您的开发风格。例如,如果我们从总体上看C#和.NET,我们可以看到整个框架(或多或少)、名称空间和所有名称空间都位于顶级名称空间
系统

当然,如果你要制作一个包含多个组件的大型JavaScript应用程序,我绝对不推荐使用这种嵌套结构(除了可能很笨拙之外,JavaScript对象属性查找还有一定的运行时成本,这可能会增加)

…尽管如此,JavaScript环境并没有得到很好的修剪。对全局属性的简单检查可以在我的机器上的空白页面(运行Chrome)上生成大约56个项目

因此,尽管我们可以而且应该尽量减少我们自己的全局使用,但现在的JS环境(特别是在使用外部库时)经常涉及全局的扩散。示例:StackOverflow总共有144个全局变量

有人知道需要多个全局变量的实例吗

全局变量是不必要的,任何使用全局变量的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应用程序来说,全局变量从来都不是必需的。

可能对于每个与应用程序无关的可重用模块来说?最突出的例子:jQuery。这就是为什么我在最初的问题中指定“针对单个Javascript应用程序”。你的意思是“每个独立模块有多个全局变量”?事实上,我不认为有理由从主应用程序例程中公开任何全局变量:-)当然。如果我们在玩语义游戏,那就是我的意思。示例中公开的一个全局变量是
myGlobalApp
这对您来说感觉如何
APP.domObjects.tables.dataTables.getFirst()
有点笨拙?您的应用程序有多大?您公开了多少全局命名空间?我更喜欢把它分解成几个物体而不是一个猛犸象。你的call.So Prototype.js及其许多全局函数是一个显著的例外?@Bergi你的意思是什么?我的帖子说,典型的库将公开至少一个新的全局变量“我确信有些情况下需要多个全局变量”——我认为具体地确定这样一个情况(或者通常定义这样一类情况)这是OP问题的关键。也许有一种情况是您依赖于第三方库,该库希望您的页面在代码中有一些全局回调。我并不是说这是一个好主意,但如果您依赖于这个第三方库,或者它的遗产,那么这将是一个示例,但显然是情境性的。onclick回调实际上应该只使用本地引用。确实需要避免使用处理程序污染全局名称空间。如果需要从嵌入webview的移动应用程序调用某些javascript功能,该怎么办?然后呢?@Bergi:是的,但如果问题是,没有新的全局变量,它能做到吗?那么答案是肯定的(尽管它并不漂亮)<代码>window.Object.myJSONPHandler=函数(d){…}
然后将JSONP调用包装器设置为
Object.myJSONPHandler
var i = 0;
for (var prop in window) {
    if (window.hasOwnProperty(prop)) {
        i++;
    }
}
(function(arg1, arg2) {
    var init = function (args) {...};
    var methodOne = function () {...};
    var methodTwo = function () {...};
    var propertyOne = 'string for example';

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