或者甚至可能覆盖 JSON.parse 的某些部分来解析函数?这对时间不敏感,我在代码中构建了解决方法,但是使用 eval 函数,您会认为将函数转换为字符串并返回将是小菜一碟。
问问题
340 次
2 回答
0
这是可能的,但很奇怪,您当然无法访问已解析函数的任何外部范围。调用toString
来获取函数的源代码,去掉括号,这样你就得到了函数体,然后Function.prototype.toJSON
返回它。然后在解析时,调用new Function
字符串:
Function.prototype.toJSON = function() {
// trim out beginning and end {}s
return this.toString().match(/[^{]*(?=}$)/)[0];
};
const fn = () => {
console.log('foo');
};
const json = JSON.stringify({
str: 'str',
fn
});
console.log(json);
const parsed = JSON.parse(json);
const parsedFn = new Function(parsed.fn);
parsedFn();
但是在 99% 的情况下都不需要这样做。无论实际问题是什么,都可能有更优雅的解决方案。
于 2020-04-15T04:56:24.607 回答
0
我认为没有必要去掉括号。我使用更简单的代码。它允许您将 args 传递给您的函数:
Function.prototype.toJSON = function() { return this.toString(); };
const json = JSON.stringify({
func: (a,b) => { console.log(a,b); },
a: 1
});
const parsed = JSON.parse(json);
const parsedFunc = Function('return ' + parsed.func + ';')();
parsedFunc('hello','world');
于 2020-05-20T22:34:18.090 回答