如何将字符串解析为带参数且有返回值的有效函数?
问题原因
你用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
相关产品推荐
相关产品推荐

