2010-10-21 2 views

ответ

7

Вы должны использовать функцию eval() (doc). У многих людей есть много чувств по поводу этой функции. JSON лучше всего подходит для транспортировки данных, а не функций (см. JSON). Функции должны находиться в скрипте на странице. Также есть синтаксическая ошибка в вашем опубликованном коде (функция обернута в одинарные кавычки ('), а также первый параметр console.log). Но ...

json = "{\"run\":\"function() { console.log('running...'); }\"}"; //Fixed, thanks 
obj = JSON.parse(json); 
eval(obj.run); //Logs "running..." 

Update:

О, и я ошибся. Eval, похоже, не любит анонимные функции. С измененным кодом он будет разбирать json в объект с свойством run, который является String, со значением "function() { console.log('running...'); }". . Но когда вы eval(obj.run);, вы получите SyntaxError объявляющего неожиданный (По-видимому, это (в функции ()

Итак, я могу думать о двух способах борьбы с этим:.

  1. Удалить анонимную функцию в вашей фактической строки JSON (так, чтобы ваш PHP забыть о function() {) и Eval его. Это означает, что она будет называться как только вы eval его.
  2. то, что я думаю, что вы хотите, это быть в состоянии оценить его анонимной функции, которая будет вызываться, когда вы хотите. Итак, вы могли бы написать функцию-обертку (вам нужно будет следовать вариант 1 для этого, а):

    function returnEval(str) { 
        return function() { eval(str); } 
    } 
    

    Это позволит вам назвать. Итак:

    obj = JSON.parse(json); 
    obj.run = returnEval(obj.run); 
    obj.run(); //Logs "running..." 
    

Надеется, что это помогает!

+0

Вторая строка привела меня в Chrome: SyntaxError: Неожиданный токен ILLEGAL – ajsie

+0

@weng - Исправлено. Надеюсь, я помог! – clarkf

0

JSON на самом деле не предназначен для этого, но here, кажется, хороший пример.

+0

CouchDB использует это, чтобы хранить функции уменьшения карты в базе данных. Я также должен хранить функции в базе данных. – ajsie

0

Это работает для меня в Firefox:

var json = "{'run': 'function() { console.log(\\'running...\\'); }'}"; 
eval('var j = ' + json); 
eval('var r = ' + j.run); 
r(); 
0

Попробуйте, это работает:

var JS = { "function" : "alert(new Date().getTime());" }; 

new Function ("", JS["function"])(); 

для вложенных функций, которые вы также можете использовать что-то вроде этого:

jQuery.each(JS, function(method, value) { 
     new Function ("a, b", "if (a == 'function') { new Function ('', b)(); }")(method, value); 
}); 
0

I знаю, что поток старый, но я хочу поделиться с вами, ребята. Вы можете сделать строку json и легко проанализировать эти функции.

function makeString(val){ 
    return JSON.stringify(val, function (key, value) {if (typeof value == 'function') {return value.toString();}return value;}); 
} 

function parseIt(val){ 
    return JSON.parse(string, function (key, value) {if (value.toString().search("function")>-1) {eval("var func = " + value);return func;}return value;}); 
} 
0

Без использования eval('function()') вы могли создать новую функцию, используя new Function(strName).Следующий код был протестирован с использованием FF, Chrome, IE.

<html> 
<body> 
<button onclick="test()">Try it</button> 
</body> 
</html> 
<script type="text/javascript"> 
    function test() { 

    try {  

     var myJSONObject = {"success" : true, "jsFunc" : "myFunction()"}; 
     var fnName = myJSONObject.jsFunc; 
     var fn = new Function(fnName); 
     fn(); 

     } catch (err) { 
     console.log("error:"+err.message); 
     } 

    } 

    function myFunction() { 
    console.log('Executing myFunction()'); 
    } 
</script> 
Смежные вопросы