javascript - 有没有办法在调用 toString 方法时评估函数内不是函数参数的变量?

标签 javascript node.js function eval

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

例如,如果行具有属性 employee,其值可能类似于:

{id: 1, 名字: '约翰', 姓氏: '约翰逊'},

为了显示此列,我使用以下格式化函数:

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

因此,我将此函数作为字符串发送到我的 Nodejs 后端。在此函数上调用 toString 返回与上面相同的带引号的文本:

“员工 => `${employee.firstName} ${employee.lastName}`”

然后我使用从数据库获得的参数执行这个函数。我通过调用 eval

来做到这一点

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

当函数内只有变量作为参数时,这种方法就可以正常工作。

<小时/>

这就是我的问题:

假设我有这样的代码:

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

fn.toString() 计算结果为:

“员工 => `${prefix} ${employee.firstName} ${employee.lastName}`”

但我需要它是这样的:

“员工 => `X ${employee.firstName} ${employee.lastName}`”

因为我无法访问 prefix 变量,所以我只将函数作为字符串发送到 Nodejs。

调用 toString 方法时有没有办法计算函数内部的变量?

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

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

最佳答案

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

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

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

就我个人而言,我感觉有更好的方法可以做到这一点,但我想不出在不彻底改变整个架构的情况下有任何快速修复方法。我想如果它对于 React/Angular 等来说足够好的话,那么对你来说应该也足够了。

关于javascript - 有没有办法在调用 toString 方法时评估函数内不是函数参数的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57766817/

相关文章:

php - 如何打开弹出窗口并重新加载另一个页面?

json - 用于存储和检索小对象的选项 (node.js),是否需要数据库?

c - c语言中函数的声明

r - 如何将具有相同协变量的个体的二项式响应数据分解为伯努利,反之亦然?

javascript - 添加/删除影子 DOM 中定义的类

javascript - iOS Safari 无法通过 AJAX 发送表单数据

node.js - 如何创建异步 Gulp 插件?

mysql - 如何将我的应用程序与 MySQL 数据库连接为 Oracle 云基础架构上的服务?

python - 如何将函数的文档字符串放入变量中?

javascript - 更改 window.resize 上的变量值