0

この関数をこのコードで参照渡しするにはどうすればよいですか?

var Class = function() {
    var callback1;
    var callback2;

    function buildStuff(data, callback) {
        element.onclick = function() {
            doStuff(callback);
        };
    }

    function doStuff(callback) {
        callback();
    }

    return {
        "setCallback1":function(fn) {
            callback1 = fn;
        },
        "setCallback2":function(fn) {
            callback2 = fn;
        },
        //may rebuild with different data, but same callback
        "buildFoo":function(data) {
            buildStuff(data, callback1);
        },
        //may rebuild with different data, but same callback
        "buildBar":function(data) {
            buildStuff(data, callback2);
        }
    };
}

function main() {
    var object = Class();
    object.setCallback1(function() {
        //do stuff
    });
    object.setCallback2(function() {
        //do something else
    });
}

実際に要素をクリックするとcallbackundefined. setCallback関数を呼び出した後にユーザーのクリックが発生するため、関数で設定した匿名関数であると予想されsetCallbackます。

ありがとう!

編集: 入力していただきありがとうございます。callback等しいものを動的に設定できるようにする必要があることを述べたはずです。callbackそのため、からパラメーターを削除することはできませんbuildStuff

EDIT2:混乱して申し訳ありません。私の例は、私が何をしているのかを示すには、文脈から少し外れすぎていることに気付きました。buildStuff実際には、繰り返し呼び出されるプライベート メンバー関数 (モジュール パターンを使用) です。ビルドする内容に応じて、異なるコールバックが必要です。コールバックは実際にはクラス (モジュール パターン クラス) の外で設定されるため、動的でなければなりません。コードを更新しましたが、悪い例で申し訳ありません。

4

2 に答える 2

3

で作成したクリック ハンドラーはbuildStuff、ローカル変数に対してクロージャーを作成します。関数に渡しcallbackますbuildStuffが、渡す時点ではundefined. これは他の変数を隠しているため、他の 変数の状態ではなく、このの値がcallback常に表示されます。undefined callback

代わりに、にパラメーターを渡さないでくださいbuildStuff。クロージャーが作成され、callback必要な変数がキャプチャされます。

function buildStuff() {
    element.onclick = function() {
        doStuff(callback);
    };
}

これを想像してみてください。

  1. グローバル変数は値をcallback 指します (この場合はundefined)。

  2. buildStuffではmain()、callback( undefined) が指す値をパラメータとしてに渡します。buildStuff

  3. クリック ハンドラーは、ローカル変数 + スコープ内の他の変数に対してクロージャーを作成します ( local は globalをcallback シャドウcallbackすることに注意してください)。callbackあなたのイベントハンドラーでは nowundefinedです。

  4. あなたはその後 setCallback。演算子を使用してsetCallback、グローバルcallback変数が指す値を変更します。=グローバルcallbackとローカルは異なる値を指すようになったため、イベント ハンドラーの更新で がcallback表示されません。callback

    この状況でやりたいことは、 が指す値を変更することですcallback。そのため、そこを指している他の変数も更新されますが、JavaScript ではこれを行うことができません。

于 2013-05-01T21:13:05.410 に答える
2

はい。でも、あなたはbuildStuff以前に電話したことがありますsetCallback

callback当時(未定義)の内容が使用されます。

異なるコールバックで呼び出したい場合はbuildStuff、それを行い、冗長を排除しますsetCallback:

function buildStuff(callback) {
    element.onclick = function() {
        doStuff(callback);
    };
}

function doStuff(callback) {
    callback();
}

function main() {
    buildStuff(  
      function() {
        //do something
      }
    );
}
于 2013-05-01T21:12:24.830 に答える