Ich denke, Schließungen sind völlig überflüssig für diese, und verkompliziert nur den Code.
Was Sie beschreiben, ist als statische Variable in objektorientierten Sprachen bekannt, und es kann ganz einfach in JS nachgeahmt werden, indem Eigenschaften direkt an die Funktion angehängt werden. Dies ist möglich, weil Funktionen in JS Objekte erster Klasse sind:
function run(arg) {
if (!run.ranAlready) { // run.ranAlready is undefined at first, so falsy
run.ranAlready = true;
init();
}
/* more code */
}
Dies ist viel einfacher als verschachtelte Funktionen, und Sie können weiterhin die run()
auf genau die gleiche Weise.
Ein weiterer Vorteil ist, dass Sie für Unit-Tests weiterhin auf die ranAlready
Eigenschaft von außerhalb der Funktion, um zu prüfen, ob Ihr Code korrekt funktioniert:
assert(run.runAlready == false);
run();
assert(run.runAlready === true);
Zugegeben, dies kann nicht für anonyme Funktionen verwendet werden, wie z.B. in Event-Handlern, aber ist es nicht viel sauberer, wenn man dieser anonymen Funktion einen Namen geben anstatt verschachtelte Funktionen und einen zusätzlichen Funktionsaufruf zu verwenden?