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();
apparaît un écran d'alerte.
eval("alert(1);")
ne résout pas mon problème.
javascript
string
function
ymutlu
la source
la source
Une meilleure façon de créer une fonction à partir d'une chaîne est d'utiliser
Function
:Cela a pour avantage / désavantage que les variables de la portée actuelle (si ce n'est globale) ne s'appliquent pas à la fonction nouvellement construite.
Passer des arguments est également possible:
la source
Function
vous ne polluez pas la portée locale et c'est pourquoi celaeval
rend l'optimisation si difficile pour les moteurs ... Avec l'exemple OP, je voudrais:var fnc = Function('return '+s)();
element.onclick = function() { alert("test"); }
.Vous êtes assez proche.
Voici un violon qui fonctionne .
la source
eval
Avertissement obligatoire aux futurs chercheurs:eval
peut ouvrir des failles pour les pirates: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... mais si vous connaissez ses dangers et pouvez les éviter, alors c'est un bon moyen simple de créer une fonction à partir d'une chaîneOui, l'utilisation
Function
est une excellente solution mais nous pouvons aller un peu plus loin et préparer un analyseur universel qui analyse la chaîne et la convertit en véritable fonction JavaScript ...exemples d'utilisation:
voici jsfiddle
la source
Noms de fonction dynamiques dans
JavaScript
En utilisant
Function
Source: http://marcosc.com/2012/03/dynamic-function-names-in-javascript/
En utilisant
eval
En utilisant
sjsClass
https://github.com/reduardo7/sjsClass
Exemple
la source
Cette technique peut être finalement équivalente à la méthode eval, mais je voulais l'ajouter, car elle pourrait être utile pour certains.
C'est fonctionnellement comme ajouter cet élément <script> à la fin de votre document, par exemple:
la source
Utilisez le
new Function()
avec un retour à l'intérieur et exécutez-le immédiatement.la source
Un exemple avec des arguments dynamiques:
la source