Ich habe eine statische Javascript-Funktion, die 1, 2 oder 3 Parameter annehmen kann:
function getData(id, parameters, callback) //parameters (associative array) and callback (function) are optional
Ich weiß, dass ich immer testen kann, ob ein bestimmter Parameter undefiniert ist, aber wie würde ich wissen, ob der Parameter oder der Rückruf übergeben wurde?
Was ist der beste Weg, dies zu tun?
Beispiele für das, was übergeben werden könnte:
1:
getData('offers');
2:
var array = new Array();
array['type']='lalal';
getData('offers',array);
3:
var foo = function (){...}
getData('offers',foo);
4:
getData('offers',array,foo);
javascript
jd.
quelle
quelle
Antworten:
Sie können wissen, wie viele Argumente an Ihre Funktion übergeben wurden, und Sie können überprüfen, ob Ihr zweites Argument eine Funktion ist oder nicht:
Sie können das Argumentobjekt auch folgendermaßen verwenden:
Wenn Sie interessiert sind, lesen Sie diesen Artikel von John Resig über eine Technik zur Simulation der Methodenüberladung in JavaScript.
quelle
Äh - das würde bedeuten, dass Sie Ihre Funktion mit Argumenten aufrufen, die nicht in der richtigen Reihenfolge sind ... was ich nicht empfehlen würde.
Ich würde empfehlen, stattdessen ein Objekt wie folgt in Ihre Funktion einzuspeisen:
Leistungen:
Nachteile:
Wenn Sie keine Wahl haben, können Sie mithilfe einer Funktion erkennen, ob ein Objekt tatsächlich eine Funktion ist (siehe letztes Beispiel).
Hinweis: Dies ist der richtige Weg, um eine Funktion zu erkennen:
quelle
Verwenden Sie also den Operator typeof, um festzustellen, ob der zweite Parameter ein Array oder eine Funktion ist.
Dies kann einige Vorschläge geben: http://www.planetpdf.com/developer/article.asp?ContentID=testing_for_object_types_in_ja
Ich bin mir nicht sicher, ob es sich um Arbeit oder Hausaufgaben handelt, daher möchte ich Ihnen im Moment keine Antwort geben, aber die Art der Antwort hilft Ihnen bei der Bestimmung.
quelle
Sie sollten den Typ der empfangenen Parameter überprüfen. Vielleicht sollten Sie ein
arguments
Array verwenden, da der zweite Parameter manchmal "Parameter" und manchmal "Rückruf" sein kann und die Benennung der Parameter irreführend sein kann.quelle
Ich weiß, dass dies eine ziemlich alte Frage ist, aber ich habe mich kürzlich damit befasst. Lassen Sie mich wissen, was Sie von dieser Lösung halten.
Ich habe ein Dienstprogramm erstellt, mit dem ich Argumente stark eingeben und optional lassen kann. Sie verpacken Ihre Funktion grundsätzlich in einen Proxy. Wenn Sie ein Argument überspringen, ist es undefiniert . Es kann eigenartig werden, wenn Sie mehrere optionale Argumente mit demselben Typ direkt nebeneinander haben. (Es gibt Optionen zum Übergeben von Funktionen anstelle von Typen, um benutzerdefinierte Argumentprüfungen durchzuführen und Standardwerte für jeden Parameter anzugeben.)
So sieht die Implementierung aus:
Zur Verdeutlichung ist hier was los:
Sie können den arrangArgs-Proxy-Code in meinem GitHub-Repository hier anzeigen:
https://github.com/joelvh/Sysmo.js/blob/master/sysmo.js
Hier ist die Utility-Funktion mit einigen Kommentaren, die aus dem Repository kopiert wurden:
quelle
Ich empfehle Ihnen, ArgueJS zu verwenden .
Sie können Ihre Funktion einfach folgendermaßen eingeben:
Ich habe anhand Ihrer Beispiele berücksichtigt, dass Ihr
id
Parameter eine Zeichenfolge sein soll, oder? JetztgetData
ist ein erforderlichString id
und akzeptiert die OptionenObject parameters
undFunction callback
. Alle von Ihnen veröffentlichten Anwendungsfälle funktionieren wie erwartet.quelle
Sie können die Eigenschaft object des Arguments innerhalb der Funktion verwenden.
quelle
Wollen Sie damit sagen, dass Sie Aufrufe wie diese haben können: getData (id, parameters); getData (ID, Rückruf)?
In diesem Fall können Sie sich offensichtlich nicht auf die Position verlassen und müssen sich auf die Analyse des Typs verlassen: getType () und gegebenenfalls getTypeName ()
Überprüfen Sie, ob der betreffende Parameter ein Array oder eine Funktion ist.
quelle
Ich denke, Sie möchten hier typeof () verwenden:
quelle
Wenn Ihr Problem nur mit Funktion Überlastung ist (Sie müssen überprüfen , ob ‚Parameter‘ parameter ‚Parameter‘ und nicht ‚Rückruf‘ ist), würde ich empfehlen Sie nicht über Argumenttyp nicht die Mühe und
verwenden diesen Ansatz . Die Idee ist einfach: Verwenden Sie Literalobjekte, um Ihre Parameter zu kombinieren:
quelle
Dies kann ein selbsterklärendes Beispiel sein:
quelle
Können Sie die Funktion überschreiben? Wird das nicht funktionieren:
quelle