124 votes

Existe-t-il un moyen de créer une fonction à partir d'une chaîne de caractères avec javascript ?

Par exemple ;

var s = "function test(){
  alert(1);
}";

var fnc = aMethod(s);

Si c'est la chaîne, je veux une fonction qui s'appelle fnc. Et fnc(); L'écran d'alerte s'affiche.

eval("alert(1);") ne résout pas mon problème.

181voto

Lekensteyn Points 22873

Une meilleure façon de créer une fonction à partir d'une chaîne de caractères est d'utiliser la méthode suivante Function :

var fn = Function("alert('hello there')");
fn();

Cela présente l'avantage et l'inconvénient que les variables de la portée actuelle (si elles ne sont pas globales) ne s'appliquent pas à la nouvelle fonction construite.

Le passage d'arguments est également possible :

var addition = Function("a", "b", "return a + b;");
alert(addition(5, 3)); // shows '8'

5 votes

D'accord, avec Function vous ne polluez pas la portée locale et c'est pourquoi eval rend l'optimisation si difficile pour les moteurs... Avec l'exemple de l'OP, je le ferais : var fnc = Function('return '+s)();

0 votes

Je pense que cela devrait probablement être la réponse acceptée. C'est beaucoup plus sûr que eval().

0 votes

Vous, mon ami, méritez beaucoup de votes positifs. Cela présente l'avantage de créer un objet fonction qui peut être affecté à des événements, etc. Par exemple : element.onclick = Function("alert('test') ;") ;

89voto

phnah Points 1391

J'ai ajouté un test jsperf pour 4 façons différentes de créer une fonction à partir d'une chaîne de caractères :

  • Utilisation de RegExp avec la classe Function

    var func = "function (a, b) { return a + b; }".parseFunction();

  • Utiliser la classe Function avec "return"

    var func = new Function("return " + "function (a, b) { return a + b; }")();

  • Utilisation du constructeur officiel de la fonction

    var func = new Function("a", "b", "return a + b;");

  • Utilisation d'Eval

    eval("var func = function (a, b) { return a + b; };");

http://jsben.ch/D2xTG

2 échantillons de résultats : enter image description here enter image description here

0 votes

@KthProg Détendez-vous ;). Ce n'est pas toujours mauvais, comme cette situation, le jsperf est en panne en ce moment, heureusement j'ai ajouté les captures d'écran du résultat avant qu'il soit en panne, quand j'ai reçu le commentaire de Bulk.

0 votes

@KthProg Pour votre information, il s'agit d'une réponse automatique générée par le système de modération :) elle apparaît dans une file d'attente et nous vérifions les problèmes prédéterminés, l'un d'entre eux étant le commentaire que vous avez rédigé. Ce n'est pas une règle absolue, et vous remarquerez que le commentaire est sous la forme d'une suggestion et non d'un ordre.

39voto

James Hill Points 27532

Vous êtes assez proche.

//Create string representation of function
var s = "function test(){  alert(1); }";

//"Register" the function
eval(s);

//Call the function
test();

Voici un violon de travail .

0 votes

Je savais que la fonction était déclarée, mais je ne pouvais pas deviner comment appeler le nom de la fonction. Merci beaucoup.

4 votes

Obligatoire eval un avertissement aux futurs chercheurs : eval peut ouvrir des failles pour les pirates : developer.mozilla.org/fr/US/docs/Web/JavaScript/Référence/ mais si vous connaissez ses dangers et pouvez les éviter, alors c'est un moyen simple et agréable de créer une fonction à partir d'une chaîne de caractères.

0 votes

Que faire si vous n'avez pas le nom de la fonction puisqu'il provient d'un enregistrement de la base de données ?

13voto

Alex Wheat Points 928

Oui, en utilisant Function est une excellente solution mais nous pouvons aller un peu plus loin et préparer un analyseur universel qui analyse les chaînes de caractères et les convertit en fonctions JavaScript réelles...

if (typeof String.prototype.parseFunction != 'function') {
    String.prototype.parseFunction = function () {
        var funcReg = /function *\(([^()]*)\)[ \n\t]*{(.*)}/gmi;
        var match = funcReg.exec(this.replace(/\n/g, ' '));

        if(match) {
            return new Function(match[1].split(','), match[2]);
        }

        return null;
    };
}

des exemples d'utilisation :

var func = 'function (a, b) { return a + b; }'.parseFunction();
alert(func(3,4));

func = 'function (a, b) { alert("Hello from function initiated from string!"); }'.parseFunction();
func();

aquí est jsfiddle

0 votes

Hi s'il vous plaît support fonction flèche support à cette méthode ?

1 votes

Je reçois cette erreur dans typescirpt "Property 'parseFunction' does not exist on type 'String'".

11voto

Eduardo Cuomo Points 1433

Noms de fonctions dynamiques dans JavaScript

Utilisation de Function

var name = "foo";
// Implement it
var func = new Function("return function " + name + "(){ alert('hi there!'); };")();
// Test it
func();
// Next is TRUE
func.name === 'foo'

Source : http://marcosc.com/2012/03/dynamic-function-names-in-javascript/

Utilisation de eval

var name = "foo";
// Implement it
eval("function " + name + "() { alert('Foo'); };");
// Test it
foo();
// Next is TRUE
foo.name === 'foo'

Utilisation de sjsClass

https://github.com/reduardo7/sjsClass

Exemple

Class.extend('newClassName', {
    __constructor: function() {
        // ...
    }
});

var x = new newClassName();
// Next is TRUE
newClassName.name === 'newClassName'

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