gpt4 book ai didi

javascript - 启用类范围全局变量(Javascript)的潜在危险?

转载 作者:行者123 更新时间:2023-12-03 05:27:33 24 4
gpt4 key购买 nike

我有一个关于设计使用类静态/全局变量的 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”)怎么办?他们都会得到自己的私有(private)副本,还是有哪怕一丁点的可能被共享?如果是这样,那么提供全局设置界面可能会导致一些非常严重的问题!

编辑

需要明确的是,我的库实际上是按照以下方式定义的:

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;
}

这是否完全缓解了这个问题,还是仍然存在一些特殊情况?

最佳答案

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

;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;
});

关于javascript - 启用类范围全局变量(Javascript)的潜在危险?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41091454/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com