GrafF812 прав. Строго говоря, параметры, передаваемые в функцию, всегда передаются по значению. При этом, например, для параметров объектного типа таким значением является ссылка на объект. То есть в функцию передается значение, являющееся копией ссылки на объект. Поэтому присваивая новое значение параметру функции, вы лишь перезаписываете копию ссылки на объект, не меняя ни сам объект, ни оригинал самой первой ссылки, созданной за пределами функции. Звучит запутанно, но пояснить можно на схеме:
Код | /* выделить участок памяти под объект с двумя целочисленными полями. Ссылку на объект сохранить в переменной test */ var test = {x:0,y:0};
/* сделать неявную копию ссылки test и передать эту копию в вызываемую функцию в качестве аргумента */ fun(test);
function fun(t){ /* перезаписать полученную копию ссылки на объект, чтобы она указывала на новый участок памяти, отведенный под локальный объект-литерал */ t = {x:1,y:2}; }
console.log(test); /* работать с первой ссылкой */
|
Поэтому перезаписывать объекты целиком внутри функции можно только в том случае, если они являются свойствами другого содержащего их объекта, передаваемого функции в качестве аргумента:
Код | function fun(t){ t.a = {x:1,y:2}; } var test = {a:{x:5,y:0}}; fun(test); alert(test.a.x + "\n" + test.a.y);
|
|