James Moriarty: einmalige Funktions Parameterübergabe

Beitrag lesen

Die grundlegende Idee von dedlfix, dass Du diese Einmalsteuerung nach Möglichkeit ganz vermeiden solltest, kann ich nur unterstützen.

Es mag aber auch Fälle geben, wo es nicht anders geht.

Natürlich kostet ein Funktionaufruf ein bisschen Zeit, es ist in JS aber nicht wie in PHP, wo solche Aufrufe als richtig teuer gelten. Darum kannst Du diese "do it once" Steuerung schon in bar() konzentrieren. Die Einmalaktion selbst kannst Du im Sinne von Separation of Concerns nochmal in eine eigene Function auslagern.

Du solltest aber auf jeden Fall vermeiden, die Einmalausführung mit einer globalen Variablen zu steuern. Besser wäre, den Umstand zu nutzen dass Funktionen Objekte sind, denen man nach Belieben Attribute ankleben kann. Und um zum Anlegen dieses Properties nicht auf globale Variablen zugreifen zu müssen, macht man das mit einer named function expression:

var bar = function barFunc(baz) {
   if (!barFunc.hasRun) {
      barFunc.hasRun = true;
      baz = bar_single_action(baz);
   }
   return baz;
} 

Der Name barFunc ist nur innerhalb der Function sichtbar.

Eine bösere Implementierung könnte so aussehen:

var bar = function(baz) {
   bar = x => x;   // bar durch Identitätsfunktion ersetzen
   return bar_single_action(baz);
} 

COBOL Programmierer aller ALTERsstufen wären begeistert - endlich wieder selbstmodifierender Code (wer den Witz nicht kapiert, ist zu jung :D ).

Ob diese Nummer nützlich ist oder eine Form akademischer Selbstbefriedigung darstellt, ist eine andere Frage. Wenn Du irgendein IoT Device hast, das mit einem Metronom getaktet ist, mag es relevant sein. Auf allen anderen Geräten reden wir hier von Performancegewinn im Bereich weniger Nanosekunden. Da gewinnst Du vermutlich mehr, wenn Du dein Markup oder dein CSS verbesserst.

Gruß M.