52 votes

Javascript - Variable dans le nom de la fonction, possible ?

j'espère que cette question n'est pas trop simple, mais je n'en ai aucune idée :(

Comment puis-je démarrer une fonction avec une var dans le nom de la fonction ?

Par exemple ...

mes fonctions

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

démarrer la fonction

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

J'espère que quelqu'un peut m'aider.

Merci d'avance! Pierre

89voto

Quentin Points 325526

Stockez vos fonctions dans un objet au lieu d'en faire un niveau supérieur.

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

Ensuite, vous pouvez y accéder comme n'importe quel autre objet :

 at['at_' + test_id]();

Vous pouvez également y accéder directement depuis l'objet window

 window['at_' + test_id]();

… et éviter d'avoir à les stocker dans un objet, mais cela revient à jouer dans la portée globale qu'il faut éviter.

25voto

JeanHuguesRobert Points 143

Tu étais proche.

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

Cependant, ce que vous voudrez peut-être :

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

1voto

Nik Points 1832

Vous pouvez également essayer

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

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

Mais utilisez ce code si vous avez de très bonnes raisons d'utiliser eval. L'utilisation d'eval en javascript n'est pas une bonne pratique en raison de ses inconvénients tels que "une utilisation incorrecte peut ouvrir votre script à des attaques par injection".

1voto

bigdave Points 19

Il existe un meilleur moyen que l'objet window - qui n'est PAS convivial dans firefox - utilisez "self" à la place - donc dans l'exemple publié par Quentin, cela ressemble à ceci:

self['at_' + test_id]();

1voto

Cryptopat Points 119

Un exemple pour passer un tableau de paramètres à ces fonctions composées, .

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X