Javascript - Возможно переменное имя функции?
Надеюсь, этот вопрос не слишком прост, но я понятия не имею: (
Как я могу запустить функцию с var в имени функции?
Например...
мои функции
function at_26();
function at_21();
function at_99();
запустите функцию
var test_id = 21;
at_'+test_id+'(); // doesn't work
Я надеюсь, что кто-то может мне помочь.
Спасибо заранее!
Питер
Ответы
Ответ 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))
}