我有一个关于设计使用类静态/全局变量的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;
}
这是否完全缓解了问题,还是仍有一些角落案例?
答案 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;
});