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...
Це все спонукало мене до думки, що буквальні шаблони жахливо називаються і їх слід називати такими, якими вони є насправді: гередоками . Я здогадуюсь, що "буквальна" частина повинна була мене перекинути (як у, незмінному)?
Я щось пропускаю? Чи є (хороший) спосіб зробити шаблон для багаторазового використання буквальним?
Надаю вам літературу шаблону для багаторазового використання :
> 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>
тег.