For what it's, worth "variables" can be appended to the arguments list in a function.
If you assign a new value to an argument, it is doesn't affect the callers perpsective of that argument , (even with an object, the variable that points to the object itself is unique to the function. properties of that object can be modified, but replacing the object entirely has no impact on the original object).
Assigning a new value to a named argument replaces it temporarily for the current scope (and derived scopes).
There is no difference between an argument and a variable in that respect, from the interpreters point of view. even if the caller does not supply a value, an empty variable is implied for each unused argument
Also, you can create externally available "persistent" variables by simply assigning values to a named function - they are in fact objects themselves.this can even be done from inside the function.
function noVars(a1,/*vars=*/v1,v2,v3) {
if (noVars.lastA1===a1) return noVars.lastAnswer;
noVars.lastA1=a1;
v1=a1*a1;
v2=v1*v1;
v3=v2*v2*v2;
noVars.lastAnswer = a1+v1+v2+v3;
return noVars.lastAnswer;
}
the main difference is these "persistent" values survive between each call, whilst values in var,let, arguments are "empty vessels" at the start of each call. arguments can be preset by the caller, otherwise they are "undefined".
this might be seen as abusing the agument system, i see it as using it in non-standard way. any changes to the javascript spec that stops this working, would also break the fact that passing a value to an function is always "by value", even with object (the fact that an object is itself a reference is irrelevant).
this will also work:
var noVars = function (a1,/*vars=*/v1,v2,v3) {
if (noVars.lastA1===a1) return noVars.lastAnswer;
noVars.lastA1=a1;
v1=a1*a1;
v2=v1*v1;
v3=v2*v2*v2;
noVars.lastAnswer = a1+v1+v2+v3;
return noVars.lastAnswer;
};