0

或者甚至可能覆盖 JSON.parse 的某些部分来解析函数?这对时间不敏感,我在代码中构建了解决方法,但是使用 eval 函数,您会认为将函数转换为字符串并返回将是小菜一碟。

4

2 回答 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 回答