【发布时间】:2013-05-25 11:05:25
【问题描述】:
我在一个单页网络应用程序中有一些共享代码,该应用程序当前使用 "globals" 命名空间将参数存储为一个全局变量。
使用命名空间是对污染全局“窗口”对象的改进,但似乎这段代码是一个很好的闭包候选,以在调用之间保持值。我搞砸了一些想法,但似乎无法正确理解闭包的语法。
这是当前版本的伪代码。所有代码都位于“um”命名空间中。当我的共享函数最初由我的应用程序中的一个新虚拟页面调用时,我需要存储一个名为“extraData”的 JS 对象的内容。该函数的后续调用无权访问“extraData”,因此如果 underscore.js 确定,我目前将其存储在 "um.globals.extraData" 中参数是一个对象。
//***************************
// 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 内的某种 closure?
编辑
下面是“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
【问题讨论】:
标签: javascript namespaces closures globals