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

时间:2010-09-17 07:59:32

标签: javascript

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

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

例如......

我的职能

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

启动功能

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

我希望有人可以帮助我。

提前致谢! 彼得

5 个答案:

答案 0 :(得分:70)

将您的功能存储在对象中,而不是将它们置于顶级。

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

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

at['at_' + test_id]();

您也可以直接从window对象...

访问它们
window['at_' + test_id]();

...并且避免将它们存储在对象中,但这意味着要在应该避免的全局范围内进行游戏。

答案 1 :(得分:19)

你很亲密。

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

然而,你可能想要的是:

at = []
at[21] = function(){ xxx for 21 xxx }
at[test_id]()

答案 2 :(得分:2)

您也可以尝试

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

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

但如果您有充分理由使用eval,请使用此代码。在javascript中使用eval不是一个好习惯,因为它的缺点是“使用它不正确可以打开你的脚本来注入攻击。”

答案 3 :(得分:0)

有一个更好的方法然后窗口对象 - 在firefox中不友好 - 使用" self"相反 - 所以在Quentin发布的示例中它看起来像这样:

self['at_' + test_id]();

答案 4 :(得分:0)

将参数数组传递给那些组合函数的示例。

/* 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 fuction 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"])


/* Tests */
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))
}