更换名称空间的全局变量JS我有一些在当前使用“全局”命名空间存储的参数作为全局变量单页面的Web应用程序共享代码。与JS关闭
使用一个命名空间是在污染全局的“窗口”对象的改进,但似乎这样的代码是一个很好的候选人封闭坚持调用之间的值。我搞砸了一些想法,但似乎无法获得关闭权的语法。
下面是当前版本的伪码。所有的代码都在“um”命名空间中。当我的共享函数最初由我的应用程序中的新虚拟页面调用时,我需要存储名为'extraData'的JS对象的内容。该函数的后续调用没有获得“而额外”,所以我目前将其存储在“um.globals.extraData”如果underscore.js确定该参数是一个对象。
//***************************
// IMPLEMENTATION SAMPLE
//***************************
// Define namespaces (not showing: um.grid, um.ajax, um.classes, um.constants, etc.)
window.um = window.um || {};
um.globals = um.globals || {}; /* container for namespaced 'global' variables */
um.grid.loadOrUpdate = function (iOffset, isUpdate, extra) {
var ajaxParams = new um.classes.AjaxParams();
//-----
// If 'extra' is an object, store it in a global for subsequent invocations
if (_.isObject(extra)) {
// This seems like it could be a closure candidate...
um.globals.extraData = extra;
}
ajaxParams.values = [um.constants.urlPathParams.grid];
ajaxParams.verb = um.constants.httpVerbs.GET;
// Use the global variable 'extraData'
ajaxParams.extraData = um.globals.extraData;
um.ajax.callMessaging(ajaxParams);
};
下面是一些伪代码,实际调用该函数:
//***************************
// INVOCATION SAMPLES
//***************************
// 1st invocation from virtual page 'Alpha'
um.grid.loadOrUpdate(0, false, { "alpha-key": "alpha-value" });
// 2nd invocation from virtual page 'Alpha'
um.grid.loadOrUpdate(1, true); // will re-use the "alpha" object
// 1st invocation from virtual page "Beta'
um.grid.loadOrUpdate(0, false, { "beta-key": "beta-value" });
// 2nd invocation from virtual page 'Beta'
um.grid.loadOrUpdate(1, true); // will re-use the "beta" object
我怎么能杀um.globals.extraData,并用某种关闭的内更换此um.grid.loadOrUpdate?
编辑
下面是促使我问这个问题“的JavaScript模式”一些代码:
var setup = function() {
var count = 0;
return function() {
return (count += 1);
}
};
// usage
var next = setup();
next(); // returns 1
next(); // returns 2
next(); // returns 3
我开始认为摆脱我的命名空间'全局'可能不是'loadOrUpdate ”。正如你所提到的,我只需要一个“loadOrUpdate”实例,原始实现很好。 'um.globals ...'中的值不会污染窗口名称空间,而名称'globals'则清楚地表明存储在其中的任何值都旨在全局范围内'um ...'我认为这是一种情况试图过度优化或过度设计已经运行良好的东西。全局变量本质上不是邪恶的。 :-) –
同意,这听起来像你有什么好.. –