Ich persönlich mag die "pass by reference"-Funktionalität nicht, die von verschiedenen Programmiersprachen angeboten wird. Vielleicht liegt es daran, dass ich die Konzepte der funktionalen Programmierung gerade erst entdecke, aber ich bekomme immer eine Gänsehaut, wenn ich Funktionen sehe, die Seiteneffekte verursachen (wie die Manipulation von Parametern, die per Referenz übergeben werden). Ich persönlich bin ein großer Anhänger des Prinzips der "einzigen Verantwortung".
IMHO sollte eine Funktion nur ein Ergebnis/Wert mit dem Schlüsselwort return zurückgeben. Anstatt einen Parameter/ein Argument zu ändern, würde ich nur den geänderten Parameter-/Argumentenwert zurückgeben und alle gewünschten Neuzuweisungen dem aufrufenden Code überlassen.
Aber manchmal (hoffentlich sehr selten) ist es notwendig, zwei oder mehr Ergebniswerte aus derselben Funktion zurückzugeben. In diesem Fall würde ich mich dafür entscheiden, alle diese Ergebniswerte in einer einzigen Struktur oder einem einzigen Objekt zusammenzufassen. Auch hier sollte die Verarbeitung von Neuzuweisungen dem aufrufenden Code überlassen werden.
Beispiel:
Angenommen, die Übergabe von Parametern wird durch die Verwendung eines speziellen Schlüsselworts wie "ref" in der Argumentliste unterstützt. Mein Code könnte etwa so aussehen:
//The Function
function doSomething(ref value) {
value = "Bar";
}
//The Calling Code
var value = "Foo";
doSomething(value);
console.log(value); //Bar
Stattdessen würde ich es vorziehen, so etwas zu tun:
//The Function
function doSomething(value) {
value = "Bar";
return value;
}
//The Calling Code:
var value = "Foo";
value = doSomething(value); //Reassignment
console.log(value); //Bar
Wenn ich eine Funktion schreiben müsste, die mehrere Werte zurückgibt, würde ich auch keine Parameter verwenden, die als Referenz übergeben werden. Ich würde also Code wie diesen vermeiden:
//The Function
function doSomething(ref value) {
value = "Bar";
//Do other work
var otherValue = "Something else";
return otherValue;
}
//The Calling Code
var value = "Foo";
var otherValue = doSomething(value);
console.log(value); //Bar
console.log(otherValue); //Something else
Stattdessen würde ich es vorziehen, beide neuen Werte innerhalb eines Objekts zurückzugeben, etwa so:
//The Function
function doSomething(value) {
value = "Bar";
//Do more work
var otherValue = "Something else";
return {
value: value,
otherValue: otherValue
};
}
//The Calling Code:
var value = "Foo";
var result = doSomething(value);
value = result.value; //Reassignment
console.log(value); //Bar
console.log(result.otherValue);
Diese Code-Beispiele sind ziemlich vereinfacht, aber sie zeigen grob, wie ich persönlich mit solchen Dingen umgehen würde. Es hilft mir, verschiedene Verantwortlichkeiten an der richtigen Stelle zu behalten.
Viel Spaß beim Codieren :)