Я хочу создать карту функций для своего аргумента. Эта карта будет обновляться динамически. Наконец, все функции будут вызываться с их соответствующими аргументами.Каков наиболее эффективный способ создания карты функций для аргументов?
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] }
Здесь я храню ссылки на функцию, а не все определение функции. Но я должен пройти через весь массив, чтобы добавить больше аргументов.
Есть ли лучший подход к поддержанию этой карты? Каковы недостатки вышеупомянутых подходов?
UPDATE
Ответ на вопрос «в какой ситуации я буду нуждаться в этом»:
я поддерживаю карту от аргументов функций. Я обновляю его динамически. Позже в моем коде я хочу создать обратную карту и вызвать функции со всеми своими аргументами.
Для например:
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,...])
Какую цель ставите перед собой? Я не могу придумать ситуацию, которая потребует чего-то подобного. –
Не забывайте, что функции могут иметь свойства. Вы всегда можете хранить функции в массиве и присоединять их индекс в массиве к функции как свойство, и искать их таким образом. –
@DaggNabbit, это в основном вариант решения, которое я разместил;) – plalx