ES6模板字符串作为变量?

问题描述:

好像模板字符串似乎是传递给模块的一个非常有用的东西,假设你想让调用代码提供他们想要如何格式化某些输出。ES6模板字符串作为变量?

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

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

试图进入这些三线进入REPL就会因错误为thing尚未对template线定义。

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

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

+0

也许这有助于http://*.com/questions/22607806/defer-execution-for-es6-template-literals – luislhl

+0

否。为了推迟评估模板字符串中的表达式,你需要类似的东西做了什么在C#中支持LINQ - 能够在运行时访问任何表达式的解析树,并且能够在某些上下文中评估该表达式。没有这样的事情存在于JavaScript中 - 恩,有'eval',但我认为这不是一个好主意。 – artem

+0

我想这可能是这种情况,只是想检查以防万一我失去了一些东西。谢谢。 – Paul

我能想到的唯一事情就是将模板包装在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'如果对象不存在。

+1

我昨天晚上想到了这一点,但信用发送给你。谢谢。 – Paul