You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将字符串解析为带参数且有返回值的有效函数?

问题原因

你用new Function(functionAsString)创建函数时,传入的箭头函数字符串会被当作匿名函数的函数体,而不是直接定义成目标函数。实际生成的函数逻辑是这样的:

function anonymous() {
  // 仅定义了箭头函数,但既没执行也没返回
  (left, right) => left.fields.age < right.fields.age
}

调用这个函数时,默认返回undefined,自然得不到预期的布尔值。

两种解决方法

方法1:直接定义带参数和返回值的函数体

利用new Function的参数列表特性,明确指定函数参数,然后在函数体里直接返回比较结果:

const x = { fields: { age: 0 } };
const y = { fields: { age: 1 } };

// 前两个是函数参数,第三个是函数体(直接返回比较结果)
const compareFunction = new Function('left', 'right', 'return left.fields.age < right.fields.age;');

const isXLessThanY = compareFunction(x, y);
console.log({ isXLessThanY }); // 输出 { isXLessThanY: true }

方法2:让函数体返回箭头函数

如果一定要保留箭头函数的字符串形式,可以在字符串前加return,让new Function创建的函数返回这个箭头函数,之后再调用返回的箭头函数:

const x = { fields: { age: 0 } };
const y = { fields: { age: 1 } };

const functionAsString = "return (left, right) => left.fields.age < right.fields.age;";
const getCompareFunction = new Function(functionAsString);
// 先拿到箭头函数,再传入x、y调用
const isXLessThanY = getCompareFunction()(x, y);
console.log({ isXLessThanY }); // 输出 { isXLessThanY: true }

另外,也可以用eval直接解析箭头函数字符串,但eval存在安全风险(如果字符串来源不可信),不推荐在生产环境使用:

const compareFunction = eval(functionAsString);
const isXLessThanY = compareFunction(x, y);

内容的提问来源于stack exchange,提问作者baitendbidz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 04:01:39