Viele Leute sagen, man solle einfach den "Pass an object"-Trick anwenden, damit man benannte Parameter hat.
/**
* My Function
*
* @param {Object} arg1 Named arguments
*/
function myFunc(arg1) { }
myFunc({ param1 : 70, param2 : 175});
Und das funktioniert großartig, außer... wenn es um die meisten IDEs da draußen geht, verlassen sich viele von uns Entwicklern auf Typ-/Argument-Hinweise innerhalb unserer IDE. Ich persönlich verwende PhpStorm (zusammen mit anderen JetBrains-IDEs, wie PyCharm für Python und AppCode für Objektiv-C ).
Und das größte Problem bei der Verwendung des "Übergib ein Objekt"-Tricks ist, dass die IDE beim Aufruf der Funktion einen einzigen Typ-Hinweis gibt und das war's... Woher sollen wir wissen, welche Parameter und Typen in das arg1-Objekt eingehen sollen?
![I have no idea what parameters should go in arg1]()
Also... der "Pass an object"-Trick funktioniert bei mir nicht... Er verursacht mehr Kopfschmerzen, weil ich mir den Docblock jeder Funktion ansehen muss, bevor ich weiß, welche Parameter die Funktion erwartet.... Sicher, es ist toll, wenn man bestehenden Code pflegt, aber es ist schrecklich, wenn man neuen Code schreibt.
Nun, dies ist die Technik, die ich verwende... Nun, es mag einige Probleme damit geben, und einige Entwickler mögen mir sagen, dass ich es falsch mache, und ich bin offen für diese Dinge... Ich bin immer bereit, nach besseren Möglichkeiten zu suchen, eine Aufgabe zu erfüllen... Wenn es also ein Problem mit dieser Technik gibt, dann sind Kommentare willkommen.
/**
* My Function
*
* @param {string} arg1 Argument 1
* @param {string} arg2 Argument 2
*/
function myFunc(arg1, arg2) { }
var arg1, arg2;
myFunc(arg1='Param1', arg2='Param2');
Auf diese Weise habe ich das Beste aus beiden Welten. Neuer Code ist leicht zu schreiben, da meine IDE mir alle richtigen Argumente anzeigt. Und wenn ich den Code später bearbeite, sehe ich auf einen Blick nicht nur den Wert, der an die Funktion übergeben wurde, sondern auch den Namen des Arguments. Der einzige Mehraufwand, den ich sehe, besteht darin, die Namen der Argumente als lokale Variablen zu deklarieren, um zu verhindern, dass der globale Namensraum verschmutzt wird. Sicher, es ist ein bisschen zusätzliche Tipparbeit, aber das ist trivial im Vergleich zu der Zeit, die man braucht, um Docblocks nachzuschlagen, während man neuen Code schreibt oder bestehenden Code pflegt.
![Now, I have all the parameters and types when creating new code]()
Aktualisierung - 2022
JavaScript hat nun die Möglichkeit, mit Hilfe der in ES6 verfügbaren Objektdestrukturierung so etwas wie benannte Parameter zu verwenden. Die meisten neueren Browser können diese Funktion nutzen Siehe Browserunterstützung
Das funktioniert folgendermaßen:
// Define your function like this
function myFunc({arg1, arg2, arg3}) {
// Function body
}
// Call your function like this
myFunc({arg1: "value1", arg2: "value2", arg3: "value3"})
// You can also have default values for arguments
function myFunc2({firstName, lastName, age = 21}) {
// Function body
}
// And you can call it with or without an "age" argument
myFunc({firstName: "John", lastName: "Doe"}) // Age will be 21
myFunc({firstName: "Jane", lastName: "Doe", age: 22})
Das Beste daran ist, dass die meisten IDEs jetzt diese Syntax unterstützen und Sie eine gute Unterstützung für Argumentationshinweise erhalten
TypScript
Diejenigen unter Ihnen, die TypeScript verwenden, können das Gleiche mit dieser Syntax tun
function myFunc(
{firstName, lastName, age = 21}:
{firstName: string, lastName: string, age?: number}
) {
// Function body
}
OR, über eine Schnittstelle
interface Params {
firstName: string
lastName: string
age?: number
}
function myFunc({firstName, lastName, age = 21}: Params) {
// Function body
}