我有一个像这样的json字符串:
json = "{'run': 'function() { console.log('running...'); }'}"
如何在json字符串中运行该函数?
答案 0 :(得分:7)
您将不得不使用eval()
(doc)功能。很多人对这个功能有很多感受。 JSON最适合传输数据,而不是函数(参见JSON)。功能应该放在页面上的脚本中。
您发布的代码中也存在语法错误(函数包含在单引号(')中,console.log的第一个参数也是如此)。
但...
json = "{\"run\":\"function() { console.log('running...'); }\"}"; //Fixed, thanks
obj = JSON.parse(json);
eval(obj.run); //Logs "running..."
<强>更新强>
哦,我错了。 Eval似乎不喜欢匿名函数。使用修改后的代码,它会将json解析为具有String
的run属性的对象,其值为"function() { console.log('running...'); }"
。但是当你eval(obj.run);
时,你会得到一个声明意外的SyntaxError(推测,这是(在函数()中。
所以,我可以想到两种方法来解决这个问题:
function () {
),然后评估它。这意味着只要您eval
它就会被调用。我认为您想要的是能够将其评估为匿名函数,该函数将在您需要时调用。所以,你可以写一个包装函数(你也需要遵循选项1):
function returnEval(str) {
return function () { eval(str); }
}
这可以让你调用它。所以:
obj = JSON.parse(json);
obj.run = returnEval(obj.run);
obj.run(); //Logs "running..."
希望这有帮助!
答案 1 :(得分:0)
JSON并非真正用于此目的,但here似乎是一个很好的例子。
答案 2 :(得分:0)
这适用于我的Firefox:
var json = "{'run': 'function() { console.log(\\'running...\\'); }'}";
eval('var j = ' + json);
eval('var r = ' + j.run);
r();
答案 3 :(得分: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 );
} );
答案 4 :(得分:0)
我知道线程已经老了,但我想与你们分享。您可以将字符串设为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;});
}
答案 5 :(得分:0)
不使用send_text = function(message){
system(paste('osascript -e \'tell application "Messages"\' -e \'send "', message, '" to buddy "555-555-5555" of (service 1 whose service type is iMessage)\' -e \'end tell\''))
}
,您可以使用eval('function()')
创建新功能。以下代码使用FF,Chrome,IE进行了测试。
new Function(strName)