Javascript - 函数名中的变量,可能吗?

IT技术 javascript
2021-01-31 01:44:58

我希望这个问题不是太简单,但我不知道:(

如何在函数名称中使用 var 启动函数?

例如 ...

我的职能

function at_26();
function at_21();
function at_99();

启动功能

var test_id = 21;   
at_'+test_id+'();   // doesn't work

我希望有人可以帮助我。

提前致谢!彼得

5个回答

将您的函数存储在一个对象中,而不是将它们置于顶层。

var at = {
    at_26: function() { },
    at_21: function() { },
    at_99: function() { }
};

然后您可以像访问任何其他对象一样访问它们:

at['at_' + test_id]();

你也可以直接从window对象访问它们......

window['at_' + test_id]();

...并避免将它们存储在一个对象中,但这意味着在应该避免的全局范围内播放。

@jonschlinkert 在这种情况下,他们应该创建一个函数数组(这些函数甚至可以是匿名的)而不是数百个函数。见Express.js路线/中间件定义为如何适当做
2021-03-27 01:44:58
测试。假设您有一个实用程序库,可以执行类似转换路径的操作。您可能有一组路径来测试每个方法。这是一种向库中添加实用程序的简单方法,而无需复制代码来运行每个新方法的测试。
2021-04-06 01:44:58
就我而言,他们没有。这只是他们可能如何不同的一个例子。有些区别仅在于对被操作数据的轻微处理要求,对它们进行分类并使用类别在处理程序之间跳转要简单得多。各种有趣的用途。
2021-04-07 01:44:58
我更好奇为什么有人会创建 100 个只有一个索引不同的函数......
2021-04-10 01:44:58

你很接近。

var test_id = 21
this['at_'+test_id]()

但是,您可能想要的是:

at = []
at[21] = function(){ xxx for 21 xxx }
at[test_id]()
this['is_awesome']; // Thanks
2021-04-08 01:44:58

你也可以试试

function at_26(){};
function at_21(){};
function at_99(){};

var test_id = 21;   
eval('at_'+test_id+'()'); 

但是,如果您有非常充分的理由使用 eval,请使用此代码。在 javascript 中使用 eval 不是一个好的做法,因为它有一些缺点,例如“使用不当可能会打开你的脚本进行注入攻击”。

绝不。曾经。永远使用评估。曾经。它没有有效的用例。如果你认为你需要它,你需要重新评估你在做什么。
2021-03-18 01:44:58
@elusive:谢谢你的建议。我现在添加了免责声明。请检查。
2021-03-22 01:44:58
不!eval()在这种情况下不要使用这里有更好的解决方案!
2021-04-07 01:44:58
@elusive :那是正确的,总是使用更好的解决方案。我刚刚给出了替代解决方案。希望你不要介意。
2021-04-07 01:44:58
由于并非每个人都一定知道 的邪恶eval(),因此您应该在帖子中提供此信息。除非他有很好的理由并且完全知道自己在做什么,否则任何人都不应使用此解决方案。eval()有其有效用途,但这不是其中之一。
2021-04-13 01:44:58

有一个更好的方法,然后 window 对象 - 这在 firefox 中不友好 - 使用“self”代替 - 所以在 Quentin 发布的示例中,它看起来像这样:

self['at_' + test_id]();

将参数数组传递给这些组合函数的示例,.

/* Store function names and match params */
let at = {
    at_26 : (a,b,c) => at_26(a,b,c),
    at_21 : (a,b,c) => at_21(a,b,c),
    at_99 : (a,b,c) => at_99(a,b,c),
    at_om : (a,b,c,d,e) => at_om(a,b,c,d,e)
}

/* Dynamic function router: name + array of Params */
function dynFunc(name, arrayParams){
  return at[name](...arrayParams)
}

/* Usage examples */ 
dynFunc(`at_${99}`, ["track001", 32, true])
dynFunc("at_" + "om", ["track007", [50, false], 7.123, false, "Bye"])


/* In the scope */
function at_99(a,b,c){
  console.log("Hi! " + a,b,c)
  console.log(typeof(a), typeof(b), typeof(c))
}
function at_om(a,b,c,d,e){
  console.log("Hi! " + a,b,c,d,e)
  console.log(typeof(a), typeof(b), typeof(c), typeof(d), typeof(e))
}