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
线定义。
有没有办法解决这个问题?我真的很想将模板字符串本身作为变量传递。
请注意,在问这个问题之前,我看到了有关“模糊”模板字符串的问题。这根本不是同一个问题,因为我问的是推迟执行,而不是转换为普通字符串。
答
我能想到的唯一事情就是将模板包装在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
也许这有助于http://*.com/questions/22607806/defer-execution-for-es6-template-literals – luislhl
否。为了推迟评估模板字符串中的表达式,你需要类似的东西做了什么在C#中支持LINQ - 能够在运行时访问任何表达式的解析树,并且能够在某些上下文中评估该表达式。没有这样的事情存在于JavaScript中 - 恩,有'eval',但我认为这不是一个好主意。 – artem
我想这可能是这种情况,只是想检查以防万一我失去了一些东西。谢谢。 – Paul