3

現在、「グローバル」名前空間を使用してパラメーターをグローバル変数として格納している単一ページの Web アプリケーションに共有コードがいくつかあります。

名前空間を使用すると、グローバルな「ウィンドウ」オブジェクトを汚染するよりも改善されますが、このコードは、呼び出し間で値を保持するためのクロージャーの良い候補のようです。私はいくつかのアイデアをいじりましたが、クロージャーの構文を正しく理解できないようです。

現在のバージョンの疑似コードを次に示します。すべてのコードは、"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内のある種の閉鎖に置き換えることができますか?

編集

この質問をするように促した「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
4

2 に答える 2

0

この種のアプローチはあなたが求めているものですか?

var ns = {};
(function() {
 var globals;
 ns.func = function(update,opts) {
  if(update)opts=globals;
  else globals=opts;
  console.log(opts);
 }
})();

ns.func(false,"a");
ns.func(true);
ns.func(false,"b");
ns.func(true);

出力:

a
a
b
b

匿名関数内で globals 変数のスコープを設定し、その関数で宣言された関数を、周囲 (この場合はウィンドウ) スコープ内のオブジェクトで使用できるようにしました。つまり、「globals」変数にアクセスできますが、外部からは見えません。それ。

于 2013-05-30T03:48:35.003 に答える