0

これは、この質問 (これは自己完結型ですが) のフォローアップです。3 つのメソッドを「呼び出し」ようとしていますが、jQuery map で正しく動作しません

メソッドのセットを配列に格納しようとしていますが、以下のような引数を持つセットがあります (初期メソッドは before_methods にあり、提案されたメソッドは lm_methods にあります)。私が望むものはかなり自明だと確信していますが、引数をfへの合理的な呼び出し(具体的にはarc.pLikedByTerm)にマージできるようにしたいと考えています。私は現在、次のものを持っています:

// signature
pLikedByTerm:function(term, ne, sw, m){
   ....  
}

// code before_methods just to show
this.before_methods=[arc.pLocations,arc.pLikedLocations,arc.pLikedItems];
this.lm_methods=[arc.pLocations,arc.pLikedLocations,arc.pLikedItems, arc.pLikedByTerm('surfing'),arc.pLikedByTerm('sailing')];
$.each(this.lm_methods, function(i,f){
  f(ne,sw,m);
});

これをどのように行うか、またはこれは悪い設計ですか? 慣用的な方法は何ですか?私の脳は揚げられています。

thx事前に

更新 1

以下の答えをいじってみると、これがうまくいくように見えますが、これは最も単純なことかもしれません:

var fns=[logStuff("this is msg"), logMoreArgs("a term","a you msg")];

for (var i=0; i<fns.length; i++) {
  fns[i];
}
4

2 に答える 2

1

関数の配列を持つことは、頻繁に使用される場合の一般的な方法です。たとえば、この Callback クラスを考えてみましょう。

function Callback(){
    this.callbacks = [];
}

Callback.prototype.run = function(cb) {
    for (var i=0; i<this.callbacks.length; i++) {
        this.callbacks[i]();
    }
};

次に、いくつかのコールバックを追加できます。

function logStuff(msg) {
    jsprint(msg || "No message");
}

obj = new Callback();
obj.callbacks.push(logStuff);
obj.callbacks.push(logStuff);
obj.run();

これを実行すると、デフォルト値のみが記録されていることがわかります。したがって、データをバインドしたい場合は、 bind 関数を使用できます。

関数.プロトタイプ.バインド

thisArg
バインドされた関数が呼び出されたときに、ターゲット関数に this パラメーターとして渡される値。バインドされた関数が new 演算子を使用して構築されている場合、値は無視されます。

arg1, arg2, ...
ターゲット関数を呼び出すときに、バインドされた関数に提供される引数の先頭に追加する引数。

新しいコードは、最初のパラメーターを別の文字列に設定します。パラメータはいくつでもバインドできます。

obj = new Callback();
obj.callbacks.push(logStuff.bind(null, "My message"));
obj.callbacks.push(logStuff.bind(null, "My other message"));
obj.run();

最終結果

于 2013-08-25T07:00:25.950 に答える