Подтвердить что ты не робот

Javascript - Возможно переменное имя функции?

Надеюсь, этот вопрос не слишком прост, но я понятия не имею: (

Как я могу запустить функцию с var в имени функции?

Например...

мои функции

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

запустите функцию

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

Я надеюсь, что кто-то может мне помочь.

Спасибо заранее! Питер

4b9b3361

Ответ 1

Храните свои функции в объекте, а не на верхнем уровне.

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

Затем вы можете получить к ним доступ, как и любой другой объект:

at['at_' + test_id]();

Вы также можете получить к ним доступ непосредственно из объекта window...

window['at_' + test_id]();

... и не нужно хранить их в объекте, но это означает, что вы играете в глобальной области действия, которой следует избегать.

Ответ 2

Ты был близок.

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

Однако, что вам может понадобиться:

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

Ответ 3

Вы также можете попробовать

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

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

Но используйте этот код, если у вас есть очень веские причины для использования eval. Использование eval в javascript не является хорошей практикой из-за его недостатков, таких как "использование его ненадлежащим образом может открыть ваши атаки script для инъекций".

Ответ 4

Есть лучший способ, чтобы объект window, который НЕ дружелюбен в firefox, вместо этого использует "я", поэтому в примере, отправленном Quentin, он выглядит так:

self['at_' + test_id]();

Ответ 5

Пример для передачи массива параметров в эти составные функции.

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