调用toString方法时,有没有一种方法可以计算函数内部不是函数参数的变量?

时间:2019-09-03 07:22:10

标签: javascript node.js function eval

我正在使用pdfmake在nodejs中生成PDF文件。我正在生成表,因此对于某些列,我需要发送格式化功能。

例如,如果行具有属性employee,其值可以是:

{id: 1, firstName: 'John', lastName: 'Johnson'}

为显示此列,我使用以下格式功能:

employee => `${employee.firstName} ${employee.lastName}`

因此,我将这个函数作为字符串发送到我的nodejs后端。在此函数上调用toString会从上方返回带引号的相同文本:

"employee => `${employee.firstName} ${employee.lastName}`"

然后,我使用从数据库获取的参数执行此功能。我通过致电eval

eval(`(${fnString})({id: 1, firstName: 'Test', lastName: 'Test'})`)

当仅函数内部的变量为其参数时,此方法很好用。


这是我的问题:

说我有这样的代码:

const prefix = 'X'
const fn = employee => `${prefix} ${employee.firstName} ${employee.lastName}`

fn.toString()的计算结果为:

"employee => `${prefix} ${employee.firstName} ${employee.lastName}`"

但我需要这样:

"employee => `X ${employee.firstName} ${employee.lastName}`"

因为我无权访问prefix变量,所以我只将函数作为字符串发送给nodejs。

调用toString方法时,是否可以在函数内部求值?

是的,我知道,我也可以将前缀发送给nodejs,但这并不是一个很好的解决方案,有时格式化函数可能取决于定义函数范围内的许多变量。

是的,我知道我不应该使用eval

1 个答案:

答案 0 :(得分:1)

快速而肮脏的解决方案是简单地使用字符串操作并发明自己的语法:

const fn = employee => `%PREFIX% ${employee.firstName} ${employee.lastName}`
let fnString = fn.toString();
fnString = fnString.replace('%PREFIX%', prefix);

基本上,您是在发明自己的模板语言,例如handlebars或React的jsxejs

我个人感觉有一种更好的方法可以做到这一点,但是我不考虑任何快速修复而无需彻底检查整个体系结构。我想它对React / Angular等是否足够好。对您来说应该足够好了。