Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.05.2019, 22:59
Аспирант
Отправить личное сообщение для berkut_0 Посмотреть профиль Найти все сообщения от berkut_0
 
Регистрация: 10.04.2019
Сообщений: 37

Передача параметра по ссылке
Здравствуйте.
Сегодня столкнулся с необходимостью изменения объекта внутри функции, а за её пределами эти изменения должны быть собственно видны. Был здесь, и да, опровергаю - у меня так почему то не работает, при том что передаю я полноценный объект, с полями и методами.
Мои детали: ввиду определённых логических хитросплетений (и возможно технической безграмотности), ссылка на желаемый объект объявлена глобально, изначально сразу её содержимое равняется 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 мне нужно видеть, что там находится.
НО, передаваемая переменная глобально не изменяется. Что делать ?
Ответить с цитированием
  #2 (permalink)  
Старый 15.05.2019, 23:20
Аспирант
Отправить личное сообщение для berkut_0 Посмотреть профиль Найти все сообщения от berkut_0
 
Регистрация: 10.04.2019
Сообщений: 37

Выполнил модификацию согласно изначальным требованиям:
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);
}

Из чего я делаю вывод: мало того что переменные передаются не по ссылке, так ещё их дополнительно нужно сохранять, так как судя по всему обычное присваивание делает копию объекта.
Ответить с цитированием
  #3 (permalink)  
Старый 15.05.2019, 23:49
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

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

const global1 = {},
	  global2 = {};

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

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

Последний раз редактировалось Malleys, 15.05.2019 в 23:54.
Ответить с цитированием
  #4 (permalink)  
Старый 15.05.2019, 23:54
Аспирант
Отправить личное сообщение для berkut_0 Посмотреть профиль Найти все сообщения от berkut_0
 
Регистрация: 10.04.2019
Сообщений: 37

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

В остальном, по логике я сделал тоже самое.
Ответить с цитированием
  #5 (permalink)  
Старый 16.05.2019, 00:08
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от 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);
}
Ответить с цитированием
  #6 (permalink)  
Старый 16.05.2019, 03:56
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

Сообщение от berkut_0
Из чего я делаю вывод: мало того что переменные передаются не по ссылке
Да, так и есть. В JS параметры передаются в функцию только по значению.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача значений по ссылке в функцию jQuery AlexDf jQuery 11 26.03.2015 20:58
Передача параметра в proxy из combo adamenko.artem ExtJS 1 08.07.2014 17:34
Передача аргументов по ссылке (PHP) Tim Оффтопик 6 04.02.2013 10:42
передача параметров по ссылке KOLANICH Общие вопросы Javascript 2 14.06.2010 15:25
Передача параметра из checkbox в asp страницу artwalek AJAX и COMET 3 11.08.2009 14:24