Wenn mit "wird nicht ausgeführt" gemeint ist, dass "bei mehrmaligem Aufruf nichts unternommen wird", können Sie einen Abschluss erstellen:
var something = (function() {
var executed = false;
return function() {
if (!executed) {
executed = true;
// do something
}
};
})();
something(); // "do something" happens
something(); // nothing happens
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 :
function once(fn, context) {
var result;
return function() {
if (fn) {
result = fn.apply(context || this, arguments);
fn = null;
}
return result;
};
}
Ich würde geneigt sein , zu ändern , fn = null;
zu fn = context = null;
. Es gibt keinen Grund für die Schließung, einen Verweis auf context
einmal fn
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.