Jump to content
  • 0

Передать по значение по ссылке js


Zverushka
 Share

Question

Я знаю, что нельзя передать значение по ссылке.

Но можно это сделать для объекта.

 

Имеем считывание данных json  с сервера и по их окончанию присвоение одного объекта другому.

Но, не работает:

var oils = {};// Считывание json данных в переменную    function getJSONData(file, output, func) {      isLoading = true;      var args = arguments;      $.getJSON(file, function(data, textStatus) {        isLoading = false;        if (args[1]) {          output = data;          console.log(output); // Тут все чики-пуки как надо!        }        else {          json_data = data;        }        if (args[2]) {          func();        }        return output;      }).fail(function(){        alert("Ошибка считывания json данных.");      });    }      getJSONData(address, oils, function(){        console.log(oils); // А тут все пусто, ну что же мне делать?      });
Если записать, что-нить вроде oils.a = data; То как бы заработает. Но мне нужно .a мне нужно один объект присвоить другому. Edited by Zverushka
Link to comment
Share on other sites

8 answers to this question

Recommended Posts

  • 0

Спасибо большое! В принципе сделала вот так, основываясь на примере выше:

          for (var member in output) delete output[member];          for(var key in data) output[key] = data[key]; 
 

Метода попроще и нагляднее не существует?

Кстати из с++ вроде как массивы, к примеру, это были лишь ссылки на ячейки памяти - одну ссылку другой присваиваешь и вуаля - присвоенный массив готов. Если я ничего не путаю. А тут так не получается.

Edited by Zverushka
Link to comment
Share on other sites

  • 0

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

 

Гелекси, в твоем примере каждый раз функция clone создает новый обьект и возвращает его, поэтому правильно что user !== admin.

 

Зверушка, тебе можно в колбек прокидывать data:

function getJSONData(file, func) {	isLoading = true;	$.getJSON(file, function(data, textStatus) {		isLoading = false;				if (typeof func === 'function') {			func(data);		}		//return output;	}).fail(function(){		alert("Ошибка считывания json данных.");	});}getJSONData(address, function(data){	console.log(data);});
Link to comment
Share on other sites

  • 0

параметр функции действует как локальная переменная данной функции.

Когда ты передаешь объект, то получается что этот параметр это ссылка на переданный объект.

Но так как ты не изменяешь переданный объект, а полностью его заменяешь новым, то связь теряется, и параметр output уже действует как обычная локальная переменная.

 

В пробрасывании  пришедших параметров в колбек нет ничего сложного и не понятного. Просто запускаешь функцию с параметрами.

 

Я не очень понял твоих маневров с переменной args и дальнейшие действия с ней (args[1]). Зачем? Ты их явно объявила как параметры функции (file, output, func) с ними и работай дальше.

Link to comment
Share on other sites

  • 0

@mishka, Манипуляция с args для запуска функции с одним, двумя, и тремя аргументами в отдельности. Поэтому я проверяю - задан ли аргумет, если задан - усложняю действие, если нет,пропускаю. Без этого, кажись ошибку выдает?

Link to comment
Share on other sites

  • 0

ты объявила их как параметры file, output, func

function getJSONData(file, output, func) {...

вот с ними и работай дальше.

 

Если хочешь более универсально написать функцию, чтобы она могла запускаться например так:
 

getJSONData(address, output, function(data) {    console.log(data);});getJSONData(address, function(data) {    console.log(data);});getJSONData(address, output);getJSONData(address);

я бы делал так:
 

function getJSONData() {	isLoading = true;	var args = Array.prototype.slice.apply(arguments);	var file = args[0];	var callback;	var output;		if (typeof args[args.length - 1] === 'function') {		callback = args.pop();	}	if (args[1]) {		output = args[1];	}		$.getJSON(file, function(data, textStatus) {		isLoading = false;		if (output) {					} else {					}				if (callback) {			callback(data);		}	}).fail(function(){		alert("Ошибка считывания json данных.");	});}
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy