関数の引数へのマップを作成したいと思います。このマップは動的に更新されます。最後に、すべての関数が対応する引数で呼び出されます。
function foo1(x) {
//do something with x
}
function foo2(x) {
//do something else with x
}
var map = {};
map[foo1] = [1,2,3]; //this array is updated dynamically in my code
map[foo2] = [4,5,6];
// I want to call foo1 and foo2 with their [1,2,3] and [4,5,6] arguments respectively.
私は2つのアプローチを試しました:
- マップのキーとして
foo1
(メソッドを使用して) 文字列に変換されます。toString()
その後、Function コンストラクターを使用して、この文字列から関数を取得します。しかし、これがパフォーマンスに影響するかどうかは心配です。
// This works. But concerned about the performance
map[foo1.toString()] = [1,2,3];
for(i in map){
var fn = Function( 'return '+ i)();
fn(map[i]);
}
- 関数とそれぞれの引数をラップするオブジェクトを次のように保存します。
{ fn : foo1 , args : [1,2,3] }
{ fn : foo2 , args : [4,5,6] }
ここでは、関数定義全体ではなく、関数への参照を保存します。しかし、さらに引数を追加するには、配列全体をトラバースする必要があります。
このマップを維持するためのより良い方法はありますか? 上記のアプローチの欠点は何ですか?
アップデート
「どのような状況でこれが必要になるか」という質問への回答:
引数から関数へのマップを維持しています。動的に更新します。コードの後半で、リバース マップを作成し、すべての引数を指定して関数を呼び出します。
例:
1 -> foo1
2 -> foo2
3 -> foo1,foo2
4 -> foo1
... and so on.
次に、次のような逆マップを作成します。
foo1 -> [1,3,4...]
foo2 -> [2,3,...]
そして最後に呼び出します:
foo1( [1,3,4...])
foo2( [2,3,...])