In JavaScript kann man die Liste der Argumente abrufen, die über arguments
, also ein Array-ähnliches Objekt, an eine Funktion übergeben werden:
>> function fun(a, b, c) { console.log(arguments) };
undefined
>> fun(1, 2, 3);
[1, 2, 3]
Gibt es eine Möglichkeit, ein Objekt zu erhalten, das auch den formalen Namen jedes Arguments enthält?
Das heißt, wenn man die Funktion wie oben aufruft, sollte man bekommen:
{a = 1, b = 2, c = 3}
5 Antworten
Bei einigen Browsern können Sie die Argumentnamen aus den definierten Argumenten basierend auf der toString
Darstellung Ihrer Funktion wie in dieser Frage beschrieben. Sie können dies verwenden, um die Werte selbst zuzuordnen.
Beachten Sie, dass nicht alle Parameter benannt werden müssen. Wenn ich beispielsweise Ihre Funktion oben aufrufen würde, fun(1, 2, 3, 4)
würde der letzte Parameter keinem Namen zugeordnet, wäre aber dennoch über arguments
zugänglich.
Ich würde dies nicht empfehlen, da Sie möglicherweise Daten verlieren, wenn der Code minimiert und die Funktionsargumente vom Kompressor / Obfuscator umbenannt werden.
Die Namen der formalen Parameter sind nicht zur Laufzeit verfügbar ( edit , außer als Teil des Textes im toString()
-Wert der Funktion, wie @David Hedlund hervorhebt), sondern das Argument Werte sind über das Objekt arguments
verfügbar. Wenn Sie den Code in eine Funktion schreiben, kennen natürlich die Namen, sodass Sie ein solches Objekt selbst erstellen können:
function foo(a, b, c) {
return {a: a, b: b, c: c};
}
Das gibt es nicht. Sie könnten Ihre Argumente als Objekt übergeben.
Gibt es eine Möglichkeit, ein Objekt zu erhalten, das auch den formalen Namen jedes Arguments enthält?
Nein. Formale Parameter sind im Wesentlichen dieselben wie deklarierte Variablen. Jedem Ausführungskontext ist ein Variablenobjekt (ed3) oder ein Umgebungsdatensatz (ed 5) zugeordnet, dessen Eigenschaften deklarierte Variablen und formale Parameter sind.
Sie können nicht auf dieses Objekt zugreifen und es daher nicht überprüfen, um festzustellen, welche Eigenschaften es hat.
Im globalen Ausführungskontext werden Variablen zu Eigenschaften des globalen Objekts, jedoch nicht in einem Funktionsausführungskontext. Und es gibt keine formale Methode, um zwischen Variablen und anderen Eigenschaften des globalen Objekts zu unterscheiden.