Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передать значение по ссылке в функцию 
V
    Опции темы
Vovan222
Дата 13.6.2011, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 9.9.2010

Репутация: нет
Всего: нет



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

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

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

PM MAIL   Вверх
GrafF812
Дата 13.6.2011, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 3.12.2009

Репутация: нет
Всего: нет



Вроде в JS только изменение свойств объекта влияют на внешний объект.
Код

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

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

Это сообщение отредактировал(а) GrafF812 - 13.6.2011, 18:31
PM MAIL   Вверх
Amphiluke
Дата 13.6.2011, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 39
Всего: 112



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);


Это сообщение отредактировал(а) Amphiluke - 13.6.2011, 20:02
PM   Вверх
Vovan222
Дата 14.6.2011, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 9.9.2010

Репутация: нет
Всего: нет



Amphiluke, Спасибо за подробное объяснение.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0688 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.