Here’s a very simple example using arrays. Since arrays & structs are mutated, I duplicate them in the local scope and am then able to return both for debug purposes.
<cfscript>
array function testLocal(required array a) {
local["a"] = duplicate(arguments.a); // duplicate as local to prevent mutation
arraysort(local.a, "textnocase");
return local. A;
}
array function testNoLocal(required array a) {
// duplicate required to prevent mutation of original var
// but original arg value is lost & unavailable for debugging
// arguments.a = duplicate(arguments.a);
arraysort(arguments.a, "textnocase");
return arguments.a;
}
struct function testDebug(required array a) {
local["a"] = duplicate(arguments.a); // duplicate to prevent mutation & enable easier debugging
arraysort(local.a, "textnocase");
return [
"result": local.a,
"debug": [
"local": local,
"arguments": arguments
]
];
}
writeoutput("<h2>Using local</h2>");
data = ["c", "b", "a"];
writedump(var=testLocal(data), label="should be a,b,c");
writedump(var=data, label="should be c,b,a");
writeoutput("<h2>Solely using arguments</h2>");
data = ["c", "b", "a"];
writedump(var=testNoLocal(data), label="should be a,b,c");
writedump(var=data, label="should be c,b,a");
writeoutput("<h2>Separate local & argument scopes returned for debugging</h2>");
data = ["c", "b", "a"];
writedump(var=testDebug(data), label="should be a,b,c");
writedump(var=data, label="result should be c,b,a");
</cfscript>