【问题标题】:ES6 template strings as variable?ES6模板字符串作为变量?
【发布时间】:2016-11-12 02:47:04
【问题描述】:

似乎模板字符串将是一个非常有用的东西传递到一个模块,假设你想让调用代码提供他们想要如何格式化一些输出。

事情是,至少在节点 REPL 中,模板字符串似乎是立即评估的,所以你不能。例如:

var template = `Time: ${now} | Message: ${thing.msg}`;
var thing = {msg : 'Something wicked this way comes'};
var now = new Date();

尝试将这三行输入 REPL 将出错,因为尚未在 template 的行上定义 thing

有没有办法解决这个问题?我真的很想将模板字符串本身作为变量传递。

请注意,在问这个问题之前,我看到了关于“降低”模板字符串的问题。这根本不是同一个问题,因为我要问的是推迟执行,而不是转换为普通字符串。

【问题讨论】:

  • 没有。要推迟对模板字符串中表达式的评估,您需要在 C# 中完成的类似操作以支持 LINQ - 能够在运行时访问任何表达式的解析树,以及在某些上下文中评估该表达式的能力。 javascript 中不存在这样的东西 - 嗯,有 eval 但我认为使用它不是一个好主意。
  • 我认为可能是这种情况,只是想检查一下我是否遗漏了什么。谢谢。

标签: ecmascript-6


【解决方案1】:

我唯一能想到的是将模板包装在 lambda 中以延迟执行。不确定这对您的用例是否有用?我正在考虑类似的事情:

var template = (now, thing) => `Time: ${now} | Message: ${thing && thing.msg}`;
var thing = {msg : 'Something wicked this way comes'};
var now = new Date();

console.log(template(now, thing));

使用${thing && thing.msg} 代替${thing.msg} 可以防止控制台错误,但如果对象不存在,则会返回'Message: undefined'

【讨论】:

  • 我昨晚也是这么想的,但感谢您的发帖。谢谢。
猜你喜欢
  • 2016-09-19
  • 1970-01-01
  • 2020-02-07
  • 1970-01-01
  • 2015-02-18
  • 1970-01-01
  • 2017-10-03
相关资源
最近更新 更多