tl; dr: Можно ли сделать литерал многоразового шаблона?
Я пытался использовать литералы шаблонов, но, кажется, просто не понимаю, и теперь я расстраиваюсь. Я имею в виду, я думаю, что понимаю это, но «это» не должно быть таким, как оно работает или как оно должно быть получено. Должно получиться иначе.
Все примеры, которые я вижу (даже шаблоны с тегами), требуют, чтобы «подстановки» выполнялись во время объявления, а не во время выполнения, что мне кажется совершенно бесполезным для шаблона. Может быть, я сумасшедший, но для меня «шаблон» - это документ, который содержит токены, которые заменяются, когда вы его используете, а не когда вы его создаете, иначе это просто документ (то есть строка). Шаблон хранится с токенами как токенами, и эти токены оцениваются, когда вы ... оцениваете его.
Все приводят ужасный пример, похожий на:
var a = 'asd';
return `Worthless ${a}!`
Это хорошо, но если я уже знаю a
, я бы просто return 'Worthless asd'
или return 'Worthless '+a
. В чем смысл? Шутки в сторону. Ладно, дело в лени; меньше плюсов, больше читабельности. Отлично. Но это не шаблон! Не ИМХО. И MHO - это все, что имеет значение! Проблема, IMHO, в том, что шаблон оценивается, когда он объявлен, поэтому, если вы это сделаете, IMHO:
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!`);
... чтобы было "лучше".
Я склонен называть их шаблонными гутералами из-за области, в которой они вызывают странные чувства.
<strike>
тег.