передать функцию в JSON и выполнить - PullRequest
32 голосов
/ 16 октября 2010

Можно ли как-нибудь передать функцию в виде строки json (преобразование с помощью JSON.stringify), отправить ее в другую функцию, проанализировать json и затем выполнить функцию, которая была в json?Я использую jquery и javascript.

Ответы [ 6 ]

50 голосов
/ 09 марта 2012

Да, вы можете. Есть множество способов сделать это.

И нет необходимости использовать «злую» функцию eval (пожалуйста, yahoogle, почему ее следует избегать), как указано здесь: http://javascript.about.com/library/bleval.htm

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

Не важно, был ли это JSON на каком-либо этапе.

22 голосов
/ 16 октября 2010

Вот рабочий пример

По сути, вы должны быть осторожны с такими вещами. Если вы возьмете существующую функцию javascript, превратите ее в строку и оцените ее, у вас могут возникнуть проблемы с переопределением функции. Если вы просто берете строку функции с сервера и хотите запустить ее, вы можете сделать то же, что и я, для этого 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();
});​
19 голосов
/ 16 октября 2010

Да, вы можете преобразовать функцию в строку с помощью метода toString().

Вот пример , чтобы показать преобразование функции в строку и обратно в функцию:

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();
4 голосов
/ 07 сентября 2012

посмотрите на плагин JSONfn .

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

он делает именно то, что вы просите.

-Vadim

3 голосов
/ 02 мая 2014

Я создал форк JSONfn, который позволяет вам разбирать и анализировать объекты и их прототипы. В моих основных тестах все работало нормально.

https://github.com/cgarciae/jsonfn

0 голосов
/ 16 октября 2010

Нет, вы не можете этого сделать. Функции не могут быть сериализованы JSON. Вместо преобразования объекта в JSON вы можете напрямую передать его другой функции без вызова JSON.stringify.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...