我创建了自定义stringify方法来将函数字符串化,如下所示
var myStringify=function (obj) {
return JSON.stringify(obj, function (key, value) {
if (value instanceof Function || typeof value == 'function') {
return value.toString();
}
return value;
});
}
但是当我不知道将字符串函数解析为函数对象时。 这是我的例子
var parsed=JSON.parse(jsonString);
处理完JSON.parse函数后,我得到了以下内容
parsed.run字段包含函数字符串
console.log(parsed.run) // output is "function(){console.log('foo');}"
我希望这个函数字符串回到已解析对象的属性
{run:"function(){console.log('foo');}"}
进入
{run:function(){console.log('foo');}}
我该怎么办?
答案 0 :(得分:1)
先获取身体
var string = parsed.run;
var body = string.substring(string.indexOf("{") + 1, string .lastIndexOf("}"));
现在创建一个新的函数对象并执行
new Function(body)();
您可以在浏览器控制台上尝试使用简单的演示
var string = "function(){console.log('foo');}";
var body = string.substring(string.indexOf("{") + 1, string .lastIndexOf("}"));
new Function(body)(); //outputs foo
将其重构为函数
function convertBodyToFunction(body)
{
body = string.substring(string.indexOf("{") + 1, string .lastIndexOf("}"));
return new Function(body);
}
convertBodyToFunction(parsed.run)();
答案 1 :(得分:1)
匹配函数字符串的正则表达式:
var parseFunctionString = /^\s*function(\s+[a-z0-9$_]*)?\(([^)]*)\)\s*\{([\s\S]*)\}\s*$/i;
//extended regExp, to handle fat-arrow-notation
//var parseFunctionString = /^\s*(?:function(\s+[a-z0-9$_]*)?\(([^)]*)\)\s*\{([\s\S]*)\}|\(([^)]*)\)\s*=>([\s\S]*)|([a-z0-9$_]+)\s*=>([\s\S]*))\s*$/i;
和用法:
JSON.parse(input, function(k,v){
var m = typeof v === "string" && v.match(parseFunctionString);
if(m){
return Function(m[2], m[3]);
//if you include the extended regExp
//return Function(m[2] || m[4] || m[6], m[3] || "return "+( m[5] || m[7] ));
//return Function("return " + m[0])();
}
return v;
})