Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: для новичков > Передать значение по ссылке в функцию


Автор: Vovan222 13.6.2011, 18:05
Подскажите пожалуйста можно ли в JS передать значение в функцию по ссылке, как в том же PHP или C++. Делаю так:
Код

function fun(t){
    t = {x:1,y:2};
}
var test = null;
fun(test);

Но test все равно остается null.
Хотелось бы чтобы test после выполнения функции стал объектом. Это возможно.
Спасибо.

Автор: GrafF812 13.6.2011, 18:31
Вроде в JS только изменение свойств объекта влияют на внешний объект.
Код

function fun(t){
    t.x=1;
    t.y=2;
}
var test = {x:0,y:0};
fun(test); // test{x:1,y:2}

Или как-нибудь можно передать весь объект по ссылке?

Автор: Amphiluke 13.6.2011, 19:57
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);

Автор: Vovan222 14.6.2011, 08:54
Amphiluke, Спасибо за подробное объяснение.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)