2010-12-14 8 views
7

Comment puis-je convertir une chaîne en javascript/jquery en une fonction? J'essaie d'utiliser une liste de paramètres JSON pour initialiser une fonction. Cependant, l'un des paramètres est une fonction, que je stocke comme une chaîne, et j'obtiens une erreur quand j'essaie d'utiliser eval() pour retourner la fonction.Comment convertir une chaîne JSON en une fonction en javascript?

Par exemple, si mon JSON est:

json = { "one": 700, "two": "function(e){alert(e);}" } 

Puis dans mon code:

parameters = eval(json); 
$('myDiv').addThisFeature({ 
parameter_1: json.one, 
parameter_2: eval(json.two) // <= generates error 
}) 
+0

Merci - Je sais que JSON est uniquement des données ... J'essaie d'initialiser l'objet jqGrid avec une liste de paramètres changeante, et j'utilise occasionnellement un paramètre prend une fonction ... et dans ce cas, comme la fonction lui-même a des données internes changeantes, il est plus facile de le générer et de l'envoyer en chaîne, puis de le définir dans ma bibliothèque et de l'initialiser séparément. –

Répondre

7

Exemple:http://jsfiddle.net/patrick_dw/vs83H/

var json = '{ "one": 700, "two": "function(e){alert(e);}" }'; 
var parameters = JSON.parse(json); 
eval('var func = ' + parameters.two); 
func('test'); // alerts "test" 

Vous aurez besoin de charger la bibliothèque JSON dans les navigateurs qui ne supportent pas.

Ou faire deux evals distincts:

Exemple:http://jsfiddle.net/patrick_dw/vs83H/1/

var json = '{ "one": 700, "two": "function(e){alert(e);}" }'; 
eval('var parameters = ' + json); 
eval('var func = ' + parameters.two); 
func('test'); 

Je suppose que vous êtes au courant des dangers de eval.

+0

Merci - fonctionne très bien. Je récupère le json de jquery's $(). GetJSON(), qui l'analyse sans eval. –

+0

Merci - cela fonctionne très bien. J'ai souvent entendu dire que l'évaluation est mauvaise - mais je ne sais pas vraiment pourquoi. JSON.parse() et jquery $ .parseJson() ne semblent pas évaluer la fonction - il semble donc que je doive utiliser eval(). Cependant, si quelqu'un voulait en abuser, il devrait connaître le paramètre spécifique, car jquery renvoie un objet analysé à partir d'un appel à $ .getJSON(). –

+0

@Adam: Si vous savez que vous avez un contrôle absolu sur le contenu évalué, tout va bien. C'est juste qu'il exécute une représentation sous forme de chaîne de javascript que vous lui donnez, donc s'il y a une possibilité que quelqu'un puisse passer un code malveillant, alors il ne devrait pas être utilisé. – user113716

0

Vous cherchez un moyen de pas utiliser eval c'est le meilleur que je pouvais venir avec . Utilisez le constructeur Function pour créer un function à partir d'un string.

var parsed = JSON.parse('{"one":"700", "two":"function(){return 0;}" }'); 
var func = new Function('return ' + parsed.two)(); // return parsed.two function 
alert(typeof func); // function 
alert(func()) // 0 
+0

Je pense que vous voulez supprimer le commentaire :) – Phrogz

+0

L'objet JSON n'existe pas dans tous les navigateurs. IE7 ou plus tôt ne l'avez pas – mkoryak

0

Voir this SO question. Comme cela a été dit, JSON est censé contenir des données. Pour traiter une partie des données en tant que fonction, vous devez d'abord évaluer la chaîne.

0

Vous évaluez une fonction anonyme, qui bien sûr ne sera appelée par rien. Si vous vouliez vraiment exécuter le code dans le json, le texte devrait être alert(e).

Cependant, cela ne semble pas très logique. Vous feriez mieux d'écrire du code pour gérer le contenu de l'objet json, plutôt que d'essayer d'exécuter du code incorporé dans le fichier json.

0

Aucun des deux moyens n'est particulièrement agréable, mais si vous pouvez vous débarrasser des bits de l'enveloppe de la fonction (e), alors vous pouvez utiliser var myDynamicFunction = new Function("e", "alert(e);"); Sinon, vous cherchez à utiliser eval(). Eval() est le mal en général. Si c'est JSON que vous revenez d'un appel $.getJSON ou quelque chose, vous vous ouvrez à des problèmes de sécurité.

1

Utilisez ceci:

parameters = eval('(' + json + ')'); 
$('#myDiv').addThisFeature({ 
parameter_1: parameters.one, 
parameter_2: eval('(' + parameters.two + ')') // <= does not generate an error 
}); 

Ajout des parenthèses au début et à la fin de la chaîne empêche l'erreur de syntaxe. Notez cependant que vous analysez JSON en utilisant eval (ce qui dans certains cas présente des risques de sécurité, mais je suppose que cela n'est pas pertinent car vous voulez exécuter du code arbitraire envoyé par le serveur).Si vous avez la flexibilité côté serveur (pour envoyer JSON invalide), vous pouvez simplement envoyer la fonction non indiquée sous forme de chaîne et eval devrait être capable d'analyser cela très bien.

+0

Merci - juste vu ceci ... c'est beaucoup plus propre que de définir une variable séparée pour la fonction. –

Questions connexes