Ich habe einige Funktionen, die gelegentlich (nicht immer) einen Rückruf erhalten und ausführen. Ist die Überprüfung, ob der Rückruf definiert ist / funktioniert, ein guter Stil oder gibt es einen besseren Weg?
Beispiel:
function save (callback){
.....do stuff......
if(typeof callback !== 'undefined'){
callback();
};
};
javascript
coding-style
callback
henry.oswald
quelle
quelle
typeof callback !== undefined
also lassen Sie die'
save()
? Wird das nicht einen Fehler oder eine Flusenwarnung geben, weil ein Argument fehlt? Oder ist es vollkommen in Ordnung und Rückruf ist einfachundefined
?Antworten:
Ich persönlich bevorzuge
typeof callback === 'function' && callback();
Der
typeof
Befehl ist jedoch zwielichtig und sollte nur für"undefined"
und verwendet werden"function"
Das Problem dabei
typeof !== undefined
ist, dass der Benutzer möglicherweise einen definierten Wert und keine Funktion übergibtquelle
typeof
ist nicht zwielichtig. Es ist manchmal vage, aber ich würde es nicht zwielichtig nennen. Wir sind uns jedoch einig, dass es am besten ist, zu überprüfen, ob es sich tatsächlich um eine Funktion handelt und nicht um eine Nummer, wenn Sie den Rückruf als Funktion aufrufen möchten. :-)"object"
95% der Fälle geboxt und zurückgegeben wird.typeof
verursacht kein Boxen.typeof "foo"
ist"string"
nicht"object"
. Dies ist tatsächlich die einzige Möglichkeit, um festzustellen, ob es sich um ein Zeichenfolgenprimitiv oder einString
Objekt handelt. (Vielleicht denken Sie daranObject.prototype.toString
, was sehr praktisch ist , aber Boxen verursacht.)&&
übrigens..toString
ist schön, um das zu finden[[Class]]
.Sie können auch tun:
Es ist besonders nützlich, wenn Sie das
callback
an einigen Stellen verwenden.Wenn Sie verwenden
jQuery
, haben Sie bereits eine solche Funktion namens $ .noopquelle
callback = callback || function(){};
function save (callback=noop) { ...
Einfach machen
Ich rufe den Rückruf lieber an, wenn er geliefert wird, egal um welchen Typ es sich handelt. Lassen Sie es nicht stillschweigend scheitern, damit der Implementierer weiß, dass er ein falsches Argument übergeben hat und es beheben kann.
quelle
ECMAScript 6
quelle
Anstatt den Rückruf optional zu machen, weisen Sie einfach einen Standard zu und rufen Sie ihn auf, egal was passiert
Wenn benutzt
Ein solcher Stil wird als Continuation-Passing-Stil bezeichnet . Hier ist ein reales Beispiel,
combinations
das alle möglichen Kombinationen einer Array-Eingabe generiertDa
combinations
der obige Aufruf im Continuation-Passing-Stil definiert ist, ist er praktisch derselbeWir können auch eine benutzerdefinierte Fortsetzung übergeben, die etwas anderes mit dem Ergebnis macht
Der Continuation-Passing-Stil kann mit überraschend eleganten Ergebnissen verwendet werden
quelle
Ich war es so leid, immer wieder denselben Ausschnitt zu sehen, dass ich Folgendes schrieb:
Ich habe Hunderte von Funktionen, die Dinge wie tun
oder Wasauchimmer...
Ich bin skeptisch gegenüber der gesamten Strategie "Stellen Sie sicher, dass sie funktioniert". Die einzigen legitimen Werte sind eine Funktion oder eine Falschheit. Was tun Sie, wenn jemand eine Zahl ungleich Null oder eine nicht leere Zeichenfolge übergibt? Wie löst das Ignorieren des Problems das Problem?
quelle
save( { callback : confirmProfileSaved, priority: "low" })
Eine gültige Funktion basiert auf dem Funktionsprototyp. Verwenden Sie:
um sicherzugehen, dass der Rückruf eine Funktion ist
quelle
Wenn das Kriterium für die Ausführung des Rückrufs lautet, ob er definiert ist oder nicht, ist alles in Ordnung. Außerdem schlage ich vor zu prüfen, ob es wirklich eine Funktion zusätzlich ist.
quelle
Ich bin zum Kaffee-Skript übergegangen und habe festgestellt, dass Standardargumente ein guter Weg sind, um dieses Problem zu lösen
quelle
Mit ArgueJS geht das ganz einfach :
quelle