启用全级全局变量(Javascript)的潜在危险?

时间:2016-12-11 21:42:14

标签: javascript global-variables javascript-objects

我有一个关于设计使用类静态/全局变量的Javascript类型的相对安全性的问题。例如,假设我们有:

function whatever()
{
    if(whatever.initialized === undefined)
    {
        whatever.global_setting = 1024;
        whatever.initialized = true;
    }
}

whatever.prototype.get_global_setting = function()
{
    return whatever.global_setting;
}

whatever.prototype.set_global_setting = function(setting)
{
    whatever.global_setting = setting;
}  

现在,如果只有一个开发人员/团队使用该库,那么他们决定在全班规模上做的任何废话都不会是一个大问题。

但是,如果我们在一个网页(广告合作伙伴等)中运行多个组织的脚本,所有这些脚本都是从同一个代码库访问库(例如:“XYZ.com/scripts.js”),该怎么办?他们都会得到他们自己的私人副本,或者是否有可能被分享的最轻微的可能性?如果是这样,那么为全局设置提供界面可能会导致一些非常严重的问题!

修改

为了清楚起见,我的库实际上更多地定义了这个:

var whatever = 
(
    function() 
    {
        "use strict";

        function internal_whatever()
        {
            if(internal_whatever.initialized === undefined)
            {
                internal_whatever.global_setting = true;
                internal_whatever.initialized = true;
            }
        }

        internal_whatever.prototype.get_global_setting = function()
        {
            return internal_whatever.global_setting;
        }

        internal_whatever.prototype.set_global_setting = function(setting)
        {
            internal_whatever.global_setting = setting;
        }    

        return internal_whatever;
    }
)();

if(typeof module !== "undefined" && module.hasOwnProperty("exports")) 
{
    module.exports = whatever;
}

这是否完全缓解了问题,还是仍有一些角落案例?

1 个答案:

答案 0 :(得分:1)

好吧,您可以使用命名空间范围而不是全局范围。就像插件一样。 简化这样的事情:

;var Modules = (Modules === undefined) ? {} : Modules;
Modules.whatever = {
    _nonecares: 1234,

    whatever: function(){
        return this._nonecares
    }
};
console.log(Modules.whatever._nonecares);

这是最新的jquery如何做到的:

(function(global, factory){
    "use strict";

    // Pass this if window is not defined yet
})(typeof window !== "undefined" ? window : this, function( window, noGlobal){
    "use strict";

    // Expose jQuery and $ identifiers, even in AMD
    // (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
    // and CommonJS for browser emulators (#13566)
    if( !noGlobal ){
        window.jQuery = window.$ = jQuery;
    }

    return jQuery;
});