2015-09-02 10 views
17

Ich habe eine Funktion wie definiertParameternamen mit ES6?</p> <pre><code>function call_api(url, callback, query = {}, body = {}) </code></pre> <p>ich eine Syntax erwartet, wo ich Körper und Abfrage überspringen bieten kann:

call_api('/api/clients/new', function(x){console.log(x)}, body={1:2}) 

Aber ich habe diese Abhilfe verwenden:

call_api('/api/clients/new', function(x){console.log(x)}, {}, {1:2}) 

Auch wenn ich body= zur Verfügung stelle, erscheint es als der query Parameter. Ich benutze Babel mit Webpack. Ich habe die Syntax in der Chrome-Konsole und in der Webpack-Quelle ausprobiert.

Wird eine solche Syntax von ES6 unterstützt? Wie funktioniert es?

+0

Großer Artikel über Ihre Optionen: http://www.2ality.com/2011/11/keyword-parameters.html – CodingIntrigue

+5

Default-Werte! = Benannte Argumente –

Antwort

17

Ich empfehle, dass Sie ein Objekt mit dem Führen und mit Destrukturierung für Objekte dieses Problem umgehen:

function callApi({url, callback, query = {}, body = {}}) 

Und dann nenne es:

callAPI({url: "/api/..", callback: (x => console.log(x)), body: {a:2}}) 

Das würde Ihnen eine Syntax geben, die der von Ihnen gewünschten ähnelt.

Benannte Argumente wurden im Gegensatz zu anderen Sprachen wie C# und Python für JavaScript berücksichtigt und abgelehnt. Here is a recent discussion about it aus der Sprachen-Mailingliste.

+0

das ist ziemlich kranker Mann! – marcusshep

1

Wie in this site gezeigt, sind die Standardwerte nur für Parameter, die einen Standardwert benötigen (wie einen Optionsparameter), aber nicht für das Überspringen von Parametern.

Was Sie versuchen zu tun, ist

// function definition 
function hi(a,b,c,d) 

// function call 
hi(a,b,d) 

ES6 noch denken wird, dass Ihr ‚d‘ ist die definierte c, unabhängig von Ihrem Standardwert.
Also nein, ES6 hat keine solche Syntax.

2

Sie können nicht angeben, welchen Parameter Sie in Ihrem Anruf zugewiesen haben.

call_api('/api/clients/new', function(x){console.log(x)}, body={1:2})

entspricht eine Variable mit dem Namen Körper außerhalb der Funktion zu setzen und dann seinen Wert an der Stelle der Abfrage-Parameter übergeben.

Sie könnten Destrukturierung verwenden, um zu erreichen, was Sie wollen.

function call_api(url, callback, {query = {}, body = {}} = {})

dann in Ihren Anruf würden Sie dies tun

call_api('/api/clients/new', function(x){console.log(x)}, {body:{1:2}})

+0

das scheint nicht zu funktionieren, wenn Sie Ihre Funktion ohne eine aufrufen drittes Argument überhaupt ... aber ... 'Funktion call_api (URL, Rückruf, {Frage = {}, Körper = {}} = {})' tut –

+0

Hoppla, vergaß, das hinzuzufügen. Das ist, was ich Code schnell in eine Textbox eintippe. Ich werde die Antwort aktualisieren. – Jonathan

1

Sehen, dass der Standard-Parameterwert nur verwendet, wenn der Parameter nicht definiert ist, ist der einzige Weg, um „überspringt“ einen Parameter und fällt wieder auf den Standard wäre undefined zu senden in seinem Platz:

call_api('/api/clients/new', function(x){console.log(x)}, undefined, {1:2}) 

Beispiel: Babel REPL

der Wert query innerhalb der Funktion wird {} (oder was auch immer Sie setzen standardmäßig) in diesem Fall.

Dies ist etwas ähnlich zu what Visual Basic does, wenn Sie den Standardparameterwert verwenden möchten, indem Sie einen leeren Wert übergeben. (z. B. sub name(argument 1, , , argument 4))

Wenn Sie Unterstützung für benannte Parameter wünschen, wäre der beste Kompromiss die Antwort von @Benjamin Gruenbaum.


Update: Sie könnten this article provides an option using the arguments keyword finden, oder besser noch, könnte man iterate over the ES6 ...rest parameters collection eine overloaded function in Javascript zu simulieren.