gpt4 book ai didi

javascript - 创建函数映射到参数的最有效方法是什么?

转载 作者:行者123 更新时间:2023-12-02 07:03:38 25 4
gpt4 key购买 nike

我想创建一个函数映射到它的参数。该 map 将动态更新。最后,所有函数都将使用相应的参数进行调用。

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.

我尝试了两种方法:

  • foo1 转换为字符串(使用 toString() 方法)作为 map 的键。然后我使用 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] }

这里我存储了对函数的引用而不是整个函数定义。但是我必须遍历整个数组才能添加更多参数。

有没有更好的方法来维护这张 map ?上述方法的缺点是什么?

更新

回答“在什么情况下我需要这个”这个问题:

我正在维护一个从参数到函数的映射。我动态更新它。稍后在我的代码中,我想创建一个反向映射并使用其所有参数调用函数。

例如:

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,...])

最佳答案

JavaScript 中的对象只能将字符串作为键,因此使用 map[foo1] 实际上与 map[foo1.toString()] 相同。它们都有你没有注意到的问题:它们丢弃了封闭变量,例如:

function makeCounter() {
var counter = 0;
return function() { return ++counter; }
}

如果我有

var myCounter = makeCounter();

然后 myCounter.toString() 将是 function() { return++counter; },并尝试使用 Function 构造函数重构它,将导致错误的 counter 引用。

实际上,最好的选择可能是使用函数的名称作为属性和值,使用您建议的对象:

var map = {};
map['foo1'] = { fn: foo1, args: [1, 2, 3] };

然后,如果您想稍后添加更多参数,这很明显:

map['foo1'].args.push(4);

要全部调用它们,您可以使用如下内容:

for(var functionName in map) {
if(!Object.prototype.hasOwnProperty.call(map, functionName)) {
continue;
}
map[functionName].fn.apply(null, map[functionName].args);
}

关于javascript - 创建函数映射到参数的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16247772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com