tl;dr:有可能使一个可重用的模板文字吗?
我一直试图使用模板文字,但我想我只是不明白,现在我感到沮丧。我是说,我觉得我懂了,但"它"不应该是这样的,也不应该是这样的。情况应该有所不同。
我看到的所有示例(甚至是带标签的模板)都要求“替换”在声明时完成,而不是在运行时完成,这对模板来说似乎完全没有用。也许我疯了,但“模板”对我来说是一个包含标记的文档,这些标记在你使用它时被替换,而不是在你创建它时,否则它只是一个文档(即字符串)。模板使用令牌作为令牌 &当你…评估它。
每个人都举了一个可怕的例子:
var a = 'asd';
return `Worthless ${a}!`
这很好,但如果我已经知道a
,我只会return 'Worthless asd'
或return 'Worthless '+a
。有什么意义?认真对待。好吧,重点是懒惰;加号少,可读性强。太好了。但这不是模板!恕我直言。MHO才是最重要的!问题,恕我直言,是模板在声明时被求值,所以,如果你这样做,恕我直言:
var tpl = `My ${expletive} template`;
function go() { return tpl; }
go(); // SPACE-TIME ENDS!
由于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...
这一切都让我相信模板字面量是可怕的错误命名,应该被称为他们真正的名字:heredoc。我猜“字面”部分应该提示我(在,不可变)?
我遗漏了什么吗?是否有一种(好的)方法来创建一个可重用的模板文字?
我给你可重用模板文字:
> 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!
这里是一个简单的“helper”函数…
function t(t) { return '`'+t.replace('{','${')+'`'; }
var template = t(`This is
my {expletive} reusable
template!`);
...让它“更好”。
我倾向于称它们为模板肠,因为它们产生扭曲感觉的区域。