Rolf B: String mit Variable festlegen, um diesen später in einer arr.map() Funktion zu verwenden

Beitrag lesen

problematische Seite

Hallo ebody,

oh weh, das geht tatsächlich.

Aber nicht ganz so wie Du es machst.

const str = `<li>${item}</li>`;

wertet ${item} an Ort und Stelle aus. Das willst Du nicht. Die Idee, das Template erstmal zu speichern und es dann zum passenden Zeitpunkt mit eval auszuwerten, ist aber möglich - du musst das Template dazu in einem String "verstecken". Das geht so:

const str = "`<li>${item}</li>`";
const arr = [ "a", "b", "c" ];
let list = array.map(item => eval(str));

Also - ja, geht. Ist aber ineffizient. JavaScript muss nun (vermutlich) für jeden Callback das Template neu compilieren. Wenn Du den Callback nicht gleich in array.map notieren willst, dann speichere nicht das Template, sondern die ganze Callback-Funktion in einer Variablen:

const makeItem = item => `<li>${item}</li>`;
const arr = [ "a", "b", "c" ];
let list = array.map(makeItem);

Das Problem der von Dedlfix genannten tagged templates ist zum einen, dass man Tag und Template nicht trennen kann. Du kannst nicht das Template in eine Variable legen und dann später Funktion und Template zusammenbringen. Zum anderen wird auch bei einem tagged template das Template in dem Moment ausgewertet, wo Du es zuweist. Du müsstest also eine Dummy-Variable item bereitstellen, damit die Idee eines Funktionsgenerators gelingt, oder in die geschweiften Klammern Zahlen setzen (für: erster Parameter, zweiter Parameter, etc)…

Für

const makeItem = funcTemplate`<li>${0}</li>`;

könnte man eine Funktion funcTemplate schreiben, die ihren ersten übergebenen Parameter zwischen die konstanten Bestandteile setzt. Aber ist das besser? Eher nicht.

Wenn Du rein akademische Übungen betreibst, bringt eine Rückfrage nun weiter nichts. Aber wenn Du ein konkretes Problem hast, das Du mit diesem Konstrukt lösen willst, dann solltest Du Dir auf jeden Fall noch die Raketenidee anschauen. Oder erzählen, was genau Du vorhast und welche Rahmenbedingungen zu beachten sind. Dann kann man vielleicht eine günstigere Lösung vorschlagen.

Rolf

--
sumpsi - posui - obstruxi