tl; dr: Apakah mungkin membuat template literal yang dapat digunakan kembali?
Saya telah mencoba menggunakan template literal tetapi saya rasa saya tidak mengerti dan sekarang saya menjadi frustrasi. Maksud saya, saya pikir saya mengerti, tetapi "itu" seharusnya tidak bagaimana cara kerjanya, atau bagaimana seharusnya. Ini harus berbeda.
Semua contoh yang saya lihat (bahkan templat yang diberi tag) mengharuskan "penggantian" dilakukan pada waktu deklarasi dan bukan waktu berjalan, yang tampaknya sama sekali tidak berguna bagi saya untuk templat. Mungkin saya gila, tapi "template" bagi saya adalah dokumen yang berisi token yang dapat diganti saat Anda menggunakannya, bukan saat Anda membuatnya, selain itu hanya dokumen (mis., String). Template disimpan dengan token sebagai token & token tersebut dievaluasi ketika Anda ... mengevaluasinya.
Setiap orang mengutip contoh mengerikan yang mirip dengan:
var a = 'asd';
return `Worthless ${a}!`
Itu bagus, tapi jika saya sudah tahu a
, saya akan return 'Worthless asd'
atau return 'Worthless '+a
. Apa gunanya? Sungguh. Oke, intinya adalah kemalasan; plus lebih sedikit, lebih mudah dibaca. Bagus. Tapi itu bukan template! Bukan IMHO. Dan MHO adalah yang terpenting! Masalahnya, IMHO, adalah template dievaluasi saat dideklarasikan, jadi, jika Anda melakukannya, IMHO:
var tpl = `My ${expletive} template`;
function go() { return tpl; }
go(); // SPACE-TIME ENDS!
Karena expletive
tidak dideklarasikan, itu menghasilkan sesuatu seperti My undefined template
. Super. Sebenarnya, di Chrome setidaknya, saya bahkan tidak dapat mendeklarasikan template; itu melempar kesalahan karena expletive
tidak ditentukan. Yang saya butuhkan adalah dapat melakukan substitusi setelah mendeklarasikan template:
var tpl = `My ${expletive} template`;
function go() { return tpl; }
var expletive = 'great';
go(); // My great template
Namun saya tidak melihat bagaimana ini mungkin, karena ini bukan template sebenarnya. Bahkan ketika Anda mengatakan saya harus menggunakan tag, tidak, itu tidak berfungsi:
> 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...
Ini semua telah membuat saya percaya bahwa literal template sangat salah nama dan harus disebut apa adanya: heredocs . Saya kira bagian "literal" seharusnya memberi tahu saya (seperti, tidak dapat diubah)?
Apakah saya melewatkan sesuatu? Adakah cara (yang baik) untuk membuat literal template yang dapat digunakan kembali?
Saya memberi Anda, literal template yang dapat digunakan kembali :
> 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!
Dan inilah fungsi "penolong" yang naif ...
function t(t) { return '`'+t.replace('{','${')+'`'; }
var template = t(`This is
my {expletive} reusable
template!`);
... untuk membuatnya "lebih baik".
Saya cenderung menyebutnya guterals template karena dari area mana mereka menghasilkan perasaan berkelok-kelok.
<strike>
tag.