0

私は単純なイベントリスナーを持っています:

function listen(evnt, elem, func) {
    if (elem.addEventListener)  // W3C DOM
        elem.addEventListener(evnt,func,false);
    else if (elem.attachEvent) { // IE DOM
         var r = elem.attachEvent("on"+evnt, func);
    return r;
    }
    return false;
}

パラメータでリスナーを設定したい。(パラメーターはイベントによって設定されるのではなく、特定のリスナーの一部です。

私がしていて、うまくいくように見えるのは次のとおりです。

function setlistener (param){

 listen ('custom event', document,
  function (e){
     run_func_with_param(param);
    }
  );
}

しかし、イベントが発生したときにparamが定義されていないため、正しいかどうかわかりません。

私の質問は - setlistener で設定されたパラメーターを使用して、毎回 run_func_with_param を呼び出す正しい方法ですか? つまり、イベントの結果として run_func_with_param が呼び出されると、param は記憶され、正しい値に設定されますか? (同じイベントに対して異なるパラメーターを持つ複数のリスナーが存在します)。

注: jQuery/その他のライブラリは使用しないでください。この場合、カスタム イベントを使用しています。

4

1 に答える 1

1

匿名関数を使用する場合、親スコープの引数とローカル変数は引き続き匿名関数で使用できます。

したがって、名前付きの引数paramは、に渡される無名関数内で使用できますlisten()。その関数には渡されません。親スコープから直接利用できるだけです。

コメントに注釈を付けた関数を次に示します。

function setlistener (param){
    // param is available here as an argument to setlistener
    // as a normal function argument
    listen ('custom event', document, function (e) {
        // param is still available here directly from the parent scope
        //     in this anonymous function.
        // This is one advantage of using anonymous functions.
        if (e.data.back_button==false){
          run_func_with_param(param);
        }
    });
}
于 2013-04-14T17:01:50.843 に答える