【问题标题】:Is there a way to evaluate variables inside a function which are not function arguments when calling toString method?有没有办法在调用 toString 方法时评估函数内部不是函数参数的变量?
【发布时间】:2019-09-03 07:22:10
【问题描述】:

我正在使用 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

【问题讨论】:

    标签: javascript node.js function eval


    【解决方案1】:

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

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

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

    我个人觉得有更好的方法可以做到这一点,但如果不彻底检查整个架构,我想不出任何快速解决方案。我想如果它对 React/Angular 等来说足够好的话,它应该对你来说已经足够好了。

    【讨论】:

      猜你喜欢
      • 2019-06-02
      • 2020-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-11
      相关资源
      最近更新 更多