1215 votes

Comment exécuter une fonction JavaScript dont le nom est une chaîne de caractères ?

J'ai le nom d'une fonction en JavaScript sous forme de chaîne. Comment puis-je le convertir en un pointeur de fonction pour pouvoir l'appeler plus tard ?

Selon les circonstances, il se peut que je doive également passer divers arguments dans la méthode.

Certaines de ces fonctions peuvent prendre la forme de namespace.namespace.function(args[...]) .

1599voto

Jason Bunting Points 27534

N'utilisez pas eval à moins que vous absolument, positivement n'ont pas d'autre choix.

Comme cela a été mentionné, utiliser quelque chose comme ceci serait la meilleure façon de le faire :

window["functionName"](arguments);

Toutefois, cela ne fonctionnera pas avec une fonction utilisant un espace de nom :

window["My.Namespace.functionName"](arguments); // fail

C'est comme ça qu'il faut faire :

window["My"]["Namespace"]["functionName"](arguments); // succeeds

Pour faciliter cette tâche et offrir une certaine souplesse, voici une fonction pratique :

function executeFunctionByName(functionName, context /*, args */) {
  var args = Array.prototype.slice.call(arguments, 2);
  var namespaces = functionName.split(".");
  var func = namespaces.pop();
  for(var i = 0; i < namespaces.length; i++) {
    context = context[namespaces[i]];
  }
  return context[func].apply(context, args);
}

Vous l'appelleriez comme ça :

executeFunctionByName("My.Namespace.functionName", window, arguments);

Notez que vous pouvez passer dans n'importe quel contexte que vous voulez, donc ceci ferait la même chose que ci-dessus :

executeFunctionByName("Namespace.functionName", My, arguments);

106voto

Alex Nazarov Points 535

J'ai juste pensé que je posterais une version légèrement modifiée de La fonction très utile de Jason Bunting .

Tout d'abord, j'ai simplifié la première déclaration en fournissant un deuxième paramètre à l'adresse suivante tranche() . La version originale fonctionnait bien dans tous les navigateurs sauf IE.

Deuxièmement, j'ai remplacé este con contexte dans l'instruction de retour ; sinon, este pointait toujours vers fenêtre lorsque la fonction cible était en cours d'exécution.

function executeFunctionByName(functionName, context /*, args */) {
    var args = Array.prototype.slice.call(arguments, 2);
    var namespaces = functionName.split(".");
    var func = namespaces.pop();
    for (var i = 0; i < namespaces.length; i++) {
        context = context[namespaces[i]];
    }
    return context[func].apply(context, args);
}

78voto

Eli Courtwright Points 53071

La réponse à cette autre question vous montre comment faire : L'équivalent en Javascript de la fonction locals() de Python ?

En gros, vous pouvez dire

window["foo"](arg1, arg2);

ou, comme beaucoup d'autres l'ont suggéré, vous pouvez simplement utiliser eval :

eval(fname)(arg1, arg2);

bien que cela soit extrêmement dangereux, sauf si vous êtes absolument sûr de ce que vous évaluez.

64voto

Coley Points 76

Ne pouvez-vous pas simplement faire ça :

var codeToExecute = "My.Namespace.functionName()";
var tmpFunc = new Function(codeToExecute);
tmpFunc();

Vous pouvez également exécuter tout autre JavaScript en utilisant cette méthode.

29voto

annakata Points 42676

Deux choses :

  • Évitez l'évaluation, c'est terriblement dangereux et lent.

  • deuxièmement, l'endroit où votre fonction existe n'a pas d'importance, le caractère "global" n'est pas pertinent. x.y.foo() peut être activé par le biais de x.y['foo']() o x['y']['foo']() ou même window['x']['y']['foo']() . Vous pouvez enchaîner indéfiniment comme ça.

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