tl;dr:是否可以制作可重用的模板文字?
我一直在尝试使用模板文字,但我想我就是不明白,现在我感到沮丧。我的意思是,我想我明白了,但“它”不应该是它的运作方式,或者它应该如何实现。它应该变得不同。
我看到的所有示例(甚至标记模板)都要求“替换”在声明时完成,而不是运行时完成,这对我来说对于模板来说完全没有用处。也许我疯了,但对我来说,“模板”是一个包含令牌的文档,这些令牌在您使用它时被替换,而不是在您创建它时被替换,否则它只是一个文档(即字符串)。模板与令牌一起存储作为代币当你...评估它时,这些标记就会被评估。
每个人都举了一个可怕的例子,类似于:
var a = 'asd';
return `Worthless ${a}!`
很好,但如果我已经知道了a
,我只想return 'Worthless asd'
or return 'Worthless '+a
。重点是什么?严重地。好吧,重点是懒惰;优点更少,可读性更强。伟大的。但这不是模板!恕我直言,不是。 MHO 才是最重要的!恕我直言,问题是模板在声明时会被评估,所以,如果你这样做,恕我直言:
var tpl = `My ${expletive} template`;
function go() { return tpl; }
go(); // SPACE-TIME ENDS!
Since expletive
未声明,它输出类似My undefined template
。极好的。实际上,至少在 Chrome 中,我什至无法声明模板;它会抛出一个错误,因为expletive
没有定义。我需要的是能够在声明模板后进行替换:
var tpl = `My ${expletive} template`;
function go() { return tpl; }
var expletive = 'great';
go(); // My great template
然而我不明白这是怎么可能的,因为这些并不是真正的模板。即使你说我应该使用标签,不,它们不起作用:
> explete = function(a,b) { console.log(a); console.log(b); }
< function (a,b) { console.log(a); console.log(b); }
> var tpl = explete`My ${expletive} template`
< VM2323:2 Uncaught ReferenceError: expletive is not defined...
这一切让我相信模板文字的命名严重错误,应该按照它们真正的样子来称呼:heredocs。我想“字面”部分应该给我提示(如,不可变)?
我错过了什么吗?有没有一种(好的)方法来制作可重用的模板文字?
我给你,可重用的模板文字:
> function out(t) { console.log(eval(t)); }
var template = `\`This is
my \${expletive} reusable
template!\``;
out(template);
var expletive = 'curious';
out(template);
var expletive = 'AMAZING';
out(template);
< This is
my undefined reusable
template!
This is
my curious reusable
template!
This is
my AMAZING reusable
template!
这是一个天真的“助手”功能......
function t(t) { return '`'+t.replace('{','${')+'`'; }
var template = t(`This is
my {expletive} reusable
template!`);
...使其“更好”。
我倾向于称它们为模板guterals,因为它们产生扭曲感觉的区域。