Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Передача параметра по ссылке (https://javascript.ru/forum/misc/77518-peredacha-parametra-po-ssylke.html)

berkut_0 15.05.2019 22:59

Передача параметра по ссылке
 
Здравствуйте.
Сегодня столкнулся с необходимостью изменения объекта внутри функции, а за её пределами эти изменения должны быть собственно видны. Был здесь, и да, опровергаю - у меня так почему то не работает, при том что передаю я полноценный объект, с полями и методами.
Мои детали: ввиду определённых логических хитросплетений (и возможно технической безграмотности), ссылка на желаемый объект объявлена глобально, изначально сразу её содержимое равняется null.
В зависимости от определённых условий, мне нужно передать эту ссылку в функцию, функция что-то чудит на локальном уровне, и изначально переданная глобальная переменная должна меняться соответственно.
Сделано так потому что изначально два одинаковых объекта с разными интерфейсными назначениями.
var global_1=null,global_2=null;

function Change(local_once)
{
	// здесь что-то творим с local_once
}

/* ... */

function UserAction(param)
{
	if (param==1)
		Change(global_1);
	else
		Change(global_2);
}

Доступ к глобальным переменным не должен зависеть от выполнения, а значит - должно меняться состояние в зависимости от параметров пользовательского события.
То есть, в какой-то момент в консоли по запросу global_1 или global_2 мне нужно видеть, что там находится.
НО, передаваемая переменная глобально не изменяется. Что делать ?

berkut_0 15.05.2019 23:20

Выполнил модификацию согласно изначальным требованиям:
var global_1=null,global_2=null;

function Change(param)
{
	var local_once;
	if (param==1)
		local_once=global_1;
	else
		local_once=global_2;
	// здесь что-то творим с local_once
	// НО ЭТОГО НЕ ДОСТАТОЧНО
	if (param==1)
		global_1=local_once;
	else
		global_2=local_once;
}

/* ... */

function UserAction(param)
{
	Change(param);
}

Из чего я делаю вывод: мало того что переменные передаются не по ссылке, так ещё их дополнительно нужно сохранять, так как судя по всему обычное присваивание делает копию объекта.

Malleys 15.05.2019 23:49

Оно перестаёт ссылаться, поскольку вы делаете подмену объекта! Что бы случайно не переопределить, используйте const!

const global1 = {},
	  global2 = {};

function Change(param) {
	const temp = param === 1 ? global1 : global2;
	// здесь что-то творим с temp
}

function UserAction(param) {
	Change(param);
}

berkut_0 15.05.2019 23:54

Malleys, тут сразу вопросы от "вчерашнего новичка" ...
1. Константы могут меняться ?
2. Присвоенное выше значение будет изменено в процессе изменения temp ?

В остальном, по логике я сделал тоже самое.

Malleys 16.05.2019 00:08

Цитата:

Сообщение от berkut_0
1. Константы могут меняться ? 2. Присвоенное выше значение будет изменено в процессе изменения temp ?

Не возможно произвести новое присваивание константе, но вы можете менять внутренности объекта.

Например, это может выглядеть так (если вы присваивали тем глобальным переменным числа числа)
const global1 = { value: null },
	  global2 = { value: null };

function Change(param) {
	const temp = param === 1 ? global1 : global2;
	// здесь что-то творим с temp
	temp.value = 5;
	// и теперь поменялось содержимое соответствующего глобального объекта
}

function UserAction(param) {
	Change(param);
}

Alexandroppolus 16.05.2019 03:56

Цитата:

Сообщение от berkut_0
Из чего я делаю вывод: мало того что переменные передаются не по ссылке

Да, так и есть. В JS параметры передаются в функцию только по значению.


Часовой пояс GMT +3, время: 10:37.