Передать функцию в JSON и выполнить

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

6 ответов

Решение

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

По сути, вы должны быть осторожны с такими вещами. Если вы возьмете существующую функцию 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();
});​

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

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

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

Было ли это JSON на любом этапе, не имеет значения.

Да, вы можете преобразовать функцию в строку с 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();

Взгляните на плагин JSONfn.

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

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

-Vadim

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

https://github.com/cgarciae/jsonfn

Я считаю полезным использовать функцию JavaScript call() при работе с функциями в файлах JSON.

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

Я надеюсь, что это поможет любому, кто остановится!

// Добавить библиотеку jquery

Нажми на меня

var jsonFun = {
    fun1 : function(){
    alert('Done');
  }
}

$('button').click(function(){
    jsonFun.fun1();
});

Это, я думаю, лучший способ передать функцию в JSON

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

Другие вопросы по тегам