Ich persönlich mag die "Pass by Reference" -Funktionalität, die von verschiedenen Programmiersprachen angeboten wird, nicht. Vielleicht liegt das daran, dass ich gerade die Konzepte der funktionalen Programmierung entdecke, aber ich bekomme immer Gänsehaut, wenn ich Funktionen sehe, die Nebenwirkungen verursachen (wie das Manipulieren von Parametern, die als Referenz übergeben werden). Ich persönlich begrüße nachdrücklich das Prinzip der "Einzelverantwortung".
IMHO sollte eine Funktion nur ein Ergebnis / einen Wert mit dem Schlüsselwort return zurückgeben. Anstatt einen Parameter / ein Argument zu ändern, würde ich einfach den geänderten Parameter / Argument-Wert zurückgeben und alle gewünschten Neuzuweisungen dem aufrufenden Code überlassen.
Aber manchmal (hoffentlich sehr selten) ist es notwendig, zwei oder mehr Ergebniswerte von derselben Funktion zurückzugeben. In diesem Fall würde ich mich dafür entscheiden, alle resultierenden Werte in eine einzelne Struktur oder ein einzelnes Objekt aufzunehmen. Auch hier sollte die Verarbeitung von Neuzuweisungen dem aufrufenden Code entsprechen.
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 ungefähr 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 eigentlich lieber so etwas machen:
//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. Also würde ich 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 wie folgt zurückzugeben:
//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 Codebeispiele sind ziemlich vereinfacht, aber sie zeigen grob, wie ich persönlich mit solchen Dingen umgehen würde. Es hilft mir, verschiedene Verantwortlichkeiten am richtigen Ort zu halten.
Viel Spaß beim Codieren. :) :)