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...
所有这些使我相信模板文字被严重地错误命名,应该被称为它们的真实名称: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!`);
...使其“更好”。
我倾向于称它们为模板Guteral,因为它们产生扭曲的感觉的区域。
<strike>
标签中。