web-dev-qa-db-fra.com

passer la fonction dans json et exécuter

Existe-t-il un moyen de passer une fonction en tant que chaîne json (conversion avec JSON.stringify), de l'envoyer à une autre fonction, d'analyser le json et d'exécuter la fonction qui était dans le json? J'utilise jquery et javascript.

32
amateur

Voici un travail exemple

Fondamentalement, vous devez être prudent avec ce genre de chose. Si vous prenez une fonction javascript existante, convertissez-la en chaîne et évaluez-la, vous risquez de rencontrer des problèmes de redéclaration de fonction. Si vous prenez simplement une chaîne de fonction du serveur et que vous souhaitez l'exécuter, vous pouvez faire comme je l'ai fait sur ce jsfiddle:

Javascript

var myFunc = "function test() {alert('test');}";

$(document).ready(function() {
    var data = new Object();
    data.func = myFunc;
    var jsonVal = $.toJSON(data);
    var newObj = $.evalJSON(jsonVal);
    eval(newObj.func);
    test();
});​
22
treeface

Oui, vous pouvez. Il y a des tonnes de façons de le faire.

Et il n'est pas nécessaire d'utiliser la fonction eval "evil" (veuillez yahoogle pourquoi elle devrait être évitée) comme indiqué ici: http://javascript.about.com/library/bleval.htm

var tmpFunc = new Function(codeToRun);
tmpFunc(); 

Que ce soit du JSON à n'importe quel stade ne devrait pas être pertinent.

50

Oui, vous pouvez convertir une fonction en chaîne avec sa méthode toString().

Voici un exemple pour montrer la conversion d'une fonction en chaîne et retour en fonction:

var myfunc = function () {
    alert('It works!');
}

var as_string = myfunc.toString();

as_string = as_string.replace('It works', 'It really works');

var as_func = eval('(' + as_string + ')');

as_func();
19
Skilldrick

jetez un oeil au plugin JSONfn .

http://www.eslinstructor.net/jsonfn/

il fait exactement ce que vous demandez.

-Vadim

4
vadimk

J'ai créé un fork de JSONfn qui vous permet de stringifier et d'analyser des objets et leurs prototypes. Dans mes tests de base, cela a bien fonctionné.

https://github.com/cgarciae/jsonfn

3
Cristian Garcia

J'ai trouvé utile d'utiliser la fonction JavaScript call () lorsque vous travaillez avec des fonctions dans des fichiers JSON.

var returnData = theJsonData.theFunction.call();
console.log(returnData); // prints any return data

J'espère que cela aide toute personne qui passe!

0
Bennybear