Aufruf der Funktion f
mit benannten Parametern, die als Objekt übergeben werden
o = {height: 1, width: 5, ...}
nennt im Grunde seine Zusammensetzung f(...g(o))
wo ich die Spread-Syntax verwende und g
ist eine "verbindliche" Karte, die die Objektwerte mit ihren Parameterpositionen verbindet.
Die Bindungskarte ist genau die fehlende Zutat, die durch das Array ihrer Schlüssel dargestellt werden kann:
// map 'height' to the first and 'width' to the second param
binding = ['height', 'width']
// take binding and arg object and return aray of args
withNamed = (bnd, o) => bnd.map(param => o[param])
// call f with named args via binding
f(...withNamed(binding, {hight: 1, width: 5}))
Beachten Sie die drei entkoppelte Bestandteile: die Funktion, das Objekt mit benannten Argumenten und die Bindung. Diese Entkopplung ermöglicht eine große Flexibilität bei der Verwendung dieses Konstrukts, wobei die Bindung in der Funktionsdefinition beliebig angepasst und beim Funktionsaufruf beliebig erweitert werden kann.
Sie können zum Beispiel Folgendes abkürzen height
y width
comme h
y w
innerhalb Ihrer Funktionsdefinition, um sie kürzer und übersichtlicher zu gestalten, während Sie sie aus Gründen der Klarheit weiterhin mit vollständigen Namen aufrufen möchten:
// use short params
f = (h, w) => ...
// modify f to be called with named args
ff = o => f(...withNamed(['height', 'width'], o))
// now call with real more descriptive names
ff({height: 1, width: 5})
Diese Flexibilität ist auch für die funktionale Programmierung nützlich, wo Funktionen beliebig transformiert werden können, ohne dass ihre ursprünglichen Parameternamen verloren gehen.