javascript 动态评估模板文字

bqucvtff  于 2023-04-10  发布在  Java
关注(0)|答案(3)|浏览(139)

假设我有这样的template literal:

const templateLiteral = `string text ${expression} string text`

我想动态地将模板文字计算成一个完整的字符串。

function toFoo(templateLiteral){
   //returns "string text Foo string text"
   return templateLiteral.evaluate('Foo');  
}

function toBar(templateLiteral){
  //returns "string text Bar string text"
   return templateLiteral.evaluate('Bar');  
}

function toBaz(templateLiteral){
   //returns "string text Baz string text"
   return templateLiteral.evaluate('Baz');  
}

有没有一种方法可以用模板常量来做类似的事情,或者我只是在装傻?(template.evaluate()是一个虚构的函数,但我正在用JS寻找这种功能!)

lzfw57am

lzfw57am1#

最好的方法是很明显的,简单地颠倒问题给出的情况。* 你只需要将模板字面量 Package 在一个函数中 *,然后你将延迟求值,直到你传入所需的参数。就是这么简单。

function evaluteTemplateLiteral(bar){
  return `foo ${bar} baz`;
}

现在如果你想变得更好,你可以创建这个:

function evaluateGeneric(vals, fn){
   return fn.apply(null, vals);
}

你可以像这样使用上面的:

evaluateGeneric(['brown','fox','cholo'], function(){
    return `the quick ${arguments[0]} fox ${arguments[1]}`;
});
xienkqul

xienkqul2#

带标记的模板字符串可以在这种情况下提供帮助:

function toFoo(strings, ...values) {
    console.log(strings[0]); // string text
    console.log(strings[1]); // string text
    console.log(values[0]);  // <your-passed-expression>

    // TODO: Do your manipulation
}

const val = toFoo`string text ${expression} string text`;

strings包含该行的“正常”标记,values是“可变”部分。请注意,您必须手动连接字符串。

lp0sw83n

lp0sw83n3#

我只会调用eval,当使用模板字符串时,您无论如何都在评估代码

相关问题