更換名稱空間的全局變量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 ...'我認爲這是一種情況試圖過度優化或過度設計已經運行良好的東西。全局變量本質上不是邪惡的。 :-) –
同意,這聽起來像你有什麼好.. –