Ich muss eine Funktion erstellen, die nur einmal ausgeführt werden kann, jedes Mal nach dem ersten wird sie nicht ausgeführt. Ich kenne aus C ++ und Java statische Variablen, die die Arbeit erledigen können, aber ich würde gerne wissen, ob es einen eleganteren Weg gibt, dies zu tun?
javascript
function
design-patterns
vlio20
quelle
quelle
Antworten:
Wenn mit "wird nicht ausgeführt" gemeint ist, dass "bei mehrmaligem Aufruf nichts unternommen wird", können Sie einen Abschluss erstellen:
Antwort auf einen Kommentar von @Vladloffe (jetzt gelöscht): Mit einer globalen Variablen könnte ein anderer Code den Wert des Flags "ausgeführt" zurücksetzen (welcher Name auch immer Sie dafür wählen). Bei einem Abschluss kann ein anderer Code dies weder versehentlich noch absichtlich tun.
Wie andere Antworten hier zeigen, verfügen mehrere Bibliotheken (wie Underscore und Ramda ) über eine kleine Dienstprogrammfunktion (normalerweise mit dem Namen
once()
[*] ), die eine Funktion als Argument akzeptiert und eine andere Funktion zurückgibt, die die angegebene Funktion genau einmal aufruft, unabhängig davon, wie oft wird die zurückgegebene Funktion aufgerufen. Die zurückgegebene Funktion speichert auch den Wert zwischen, der zuerst von der angegebenen Funktion zurückgegeben wurde, und gibt diesen bei nachfolgenden Aufrufen zurück.Wenn Sie jedoch keine solche Bibliothek eines Drittanbieters verwenden, aber dennoch eine solche Dienstprogrammfunktion (anstelle der oben angebotenen Nonce-Lösung) möchten, ist die Implementierung einfach genug. Die schönste Version, die ich gesehen habe, ist die von David Walsh :
Ich würde geneigt sein , zu ändern ,
fn = null;
zufn = context = null;
. Es gibt keinen Grund für die Schließung, einen Verweis aufcontext
einmalfn
aufgerufene Anrufe beizubehalten .[*] Beachten Sie jedoch, dass andere Bibliotheken, wie diese Drupal-Erweiterung für jQuery , möglicherweise eine Funktion mit dem Namen haben
once()
, die etwas ganz anderes bewirkt.quelle
if
Anweisungstestausdruck) erwartet JavaScript einen der Wertetrue
oderfalse
und der Programmablauf reagiert entsprechend dem Wert, der bei der Auswertung des Ausdrucks gefunden wurde. Bedingte Operatoren werden wie==
immer zu einem booleschen Wert ausgewertet. Eine Variable kann auch entwedertrue
oder enthaltenfalse
. (Weitere Informationen finden Sie in der Dokumentation zu Boolean , Truthy und Falsey .)Ersetzen Sie es durch eine wiederverwendbare NOOP-Funktion (keine Operation) .
quelle
setInterval(foo, 1000)
- und das funktioniert schon nicht mehr. Sie überschreiben nur die Referenz im aktuellen Bereich.invalidate
Funktion, die mitsetInterval
etc funktioniert .: Jsbin.com/vicipar/1/edit?js,consoleZeigen Sie auf eine leere Funktion, sobald sie aufgerufen wurde:
Oder wie folgt:
quelle
setInterval()
), der Verweis beim Aufruf die ursprüngliche Funktionalität wiederholt.UnderscoreJs hat eine Funktion, die das macht, underscorejs.org/#once
quelle
once
, Argumente akzeptiert zu haben . Sie könnten für beide Anrufe tunsquareo = _.once(square); console.log(squareo(1)); console.log(squareo(2));
und bekommen . Verstehe ich das richtig?1
squareo
_.once
Methode zu verwenden. Siehe jsfiddle.net/631tgc5f/1_
; Ich würde nicht empfehlen, abhängig von der gesamten Bibliothek für so ein kleines Stück Code.Wenn wir über statische Variablen sprechen, ist dies ein bisschen wie eine Abschlussvariante:
Sie können dann eine Funktion zurücksetzen, wenn Sie möchten:
quelle
quelle
Sie könnten einfach die Funktion "sich selbst entfernen" haben
Dies ist jedoch möglicherweise nicht die beste Antwort, wenn Sie keine Fehler verschlucken möchten.
Sie können dies auch tun:
Ich brauche es, um wie ein intelligenter Zeiger zu funktionieren. Wenn es keine Elemente vom Typ A gibt, kann es ausgeführt werden. Wenn es ein oder mehrere A-Elemente gibt, kann die Funktion nicht ausgeführt werden.
quelle
Once
es als Rückruf übergeben wird (zsetInterval(Once, 100)
. B. ). Die ursprüngliche Funktion wird weiterhin aufgerufen.Versuche dies
quelle
Von einem Typen namens Crockford ... :)
quelle
TypeError: Cannot read property 'apply' of null
großartig finden. Das bekommen Sie, wenn Sie die zurückgegebene Funktion zum zweiten Mal aufrufen.Wiederverwendbare
invalidate
Funktion, die funktioniert mitsetInterval
:Probieren Sie es auf JSBin aus: https://jsbin.com/vicipar/edit?js,console
Variation der Antwort von Bunyk
quelle
Hier ist ein Beispiel für JSFiddle - http://jsfiddle.net/6yL6t/
Und der Code:
Du könntest es tun:
Und es wird nur einmal laufen :)
quelle
Ersteinrichtung:
quelle
Wenn Sie Node.js verwenden oder JavaScript mit browserify schreiben, ziehen Sie das npm-Modul "einmal" in Betracht :
quelle
Wenn Sie die Funktion in Zukunft wiederverwenden möchten, funktioniert dies gut, basierend auf dem obigen Code von ed Hopp (mir ist klar, dass die ursprüngliche Frage diese zusätzliche Funktion nicht erforderte!):
Die Ausgabe sieht aus wie:
quelle
Einfacher Dekorateur, der bei Bedarf einfach zu schreiben ist
mit:
quelle
Versuch, die Unterstrichfunktion "einmal" zu verwenden:
http://underscorejs.org/#once
quelle
quelle
Wenn Sie Ramda verwenden, können Sie die Funktion "einmal" verwenden .
Ein Zitat aus der Dokumentation:
quelle
Halte es so einfach wie möglich
Sie können das Ergebnis sehen
quelle
this
anstelle vonwindow
Mit JQuery kann die Funktion nur einmal mit der Methode one () aufgerufen werden :
Implementierung mit der JQuery-Methode on () :
Implementierung mit nativem JS:
quelle
quelle
Dieser ist nützlich, um Endlosschleifen zu verhindern (mit jQuery):
Wenn Sie sich Sorgen über die Verschmutzung von Namespaces machen, ersetzen Sie "doIt" durch eine lange, zufällige Zeichenfolge.
quelle
Es hilft, eine klebrige Ausführung zu verhindern
quelle