У меня есть некоторые общий код в веб-приложения в одной страницы, что в настоящее время с помощью «GLOBALS» пространства имен для хранения параметра в качестве глобальной переменной.Заменить JS пространств имён глобальная переменная с Js закрытия
Использование пространства имен является улучшением по сравнению с загрязнением глобального объекта «окна», но похоже, что этот код является хорошим кандидатом на закрытие, чтобы сохранить значение между вызовами. Я перепутал некоторые идеи, но, похоже, не могу получить синтаксис для права закрытия.
Вот псевдокод текущей версии. Весь код находится внутри пространства имен «um». Когда моя общая функция изначально вызывается новой виртуальной страницей в моем приложении, мне нужно сохранить содержимое объекта JS с именем «extraData». Последующие вызовы функции не имеют доступа к «extraData», поэтому я в настоящее время храню ее в «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?
EDIT
Вот некоторые из кода "JavaScript Patterns", которые побудили меня задать этот вопрос:
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 ...' НЕ загрязняют пространство имен в окнах, а имя «глобальные переменные» дает понять, что любые значения, хранящиеся в нем, предназначены для глобального охвата внутри «um ...». Я думаю, что это случай от попыток чрезмерно оптимизировать или перестроить то, что уже работает очень хорошо. Переменные Глобалы не являются внутренне злыми. :-) –
Согласен, похоже, что у вас все нормально .. –