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.
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.
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'
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)();
Je pense que cela devrait probablement être la réponse acceptée. C'est beaucoup plus sûr que eval().
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') ;") ;
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; };");
@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.
@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.
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 .
Je savais que la fonction était déclarée, mais je ne pouvais pas deviner comment appeler le nom de la fonction. Merci beaucoup.
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.
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
JavaScript
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/
eval
var name = "foo";
// Implement it
eval("function " + name + "() { alert('Foo'); };");
// Test it
foo();
// Next is TRUE
foo.name === 'foo'
sjsClass
https://github.com/reduardo7/sjsClass
Class.extend('newClassName', {
__constructor: function() {
// ...
}
});
var x = new newClassName();
// Next is TRUE
newClassName.name === 'newClassName'
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.