JS对象转JSON时匿名函数丢失,如何完整导出含函数的对象?
如何导出包含函数的JavaScript对象
JSON本身不支持函数类型,所以用标准的JSON.parse/stringify处理时,函数会被自动移除。但如果要导出带函数的完整对象,有两种可行的办法:
方案1:自定义序列化和反序列化
用JSON.stringify的第二个参数(replacer)把函数转成字符串保存,再用JSON.parse的第二个参数(reviver)把字符串转回函数。
代码示例:
// 原始带函数的对象 const obj = { a: 1000, b: () => { console.log("hello"); } }; // 序列化:把函数转为源码字符串 const serialized = JSON.stringify(obj, (key, value) => { if (typeof value === 'function') { return value.toString(); } return value; }); // 反序列化:把字符串转回可执行的函数 const deserialized = JSON.parse(serialized, (key, value) => { if (typeof value === 'string' && (value.startsWith('(') || value.startsWith('function'))) { return eval(`(${value})`); } return value; }); deserialized.b(); // 执行后会打印 "hello"
方案2:直接用eval解析完整对象字符串
你示例里的eval其实已经把函数解析出来了,只是console.log默认不会显示函数的源码而已。试试打印函数的字符串形式:
let test = '({"a":1000, "b":()=>{return console.log("hello");}})'; test = eval(test); console.log(test.b.toString()); // 会输出: ()=>{return console.log("hello");}
这种方式直接处理JS对象语法,不需要转成JSON,但要注意必须确保字符串是完全可信的,不然eval会执行恶意代码,风险很高。
重要提醒
- 这种带函数的“伪JSON”只能在JavaScript环境中解析,没法跨语言兼容,如果需要和其他语言交互,建议把函数逻辑存成普通字符串,到目标环境再手动处理。
eval存在严重的安全隐患,非绝对信任的数据源绝对不能用。
内容的提问来源于stack exchange,提问作者Kyle
相关产品推荐
相关产品推荐

