Почему функция возвращает значение локальной переменной JSON вместо глобальной? - PullRequest
3 голосов
/ 15 сентября 2010

У меня есть глобальная переменная JSON, в которой я храню некоторые параметры, и затем каждый раз, когда я запускаю функцию, я хочу иметь возможность изменять их, но только локально внутри этой функции.

Так что каждый раз, когда я запускаю функциюМне нужна свежая копия глобальной переменной внутри локальной.

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

Спасибо!:)

var test = {"name":"me"};
function bla() {
  var t=test;
  t.name="you";
  t.age=55;
  alert(test.name); // Returns "you" that have been set locally instead of "me" that was global value.
}
bla();

Ответы [ 5 ]

2 голосов
/ 15 сентября 2010

var t = test не создает копию объекта. Он просто ссылается на тот же объект с другим именем. Если вы хотите скопировать объект, рассмотрите возможность использования функции jQuery $.extend():

var t = $.extend({}, test);

В этой теме эквивалентный код для массивов следующий:

var t = test.slice(0);
2 голосов
/ 15 сентября 2010

на вашей линии

var t=test;

вы не копируете содержимое test, вы создаете новую ссылку на тот же контент. следовательно, любая модификация содержимого t также изменяет test.

2 голосов
/ 15 сентября 2010

Объекты назначаются по ссылке, поэтому после

var t=test;

переменные t и test относятся к одному и тому же объекту. Вам нужно сделать копию объекта, чтобы получить поведение, которое вы ищете. Поскольку вы работаете с JSON, вы можете просто сериализовать исходный объект, а затем повторно проанализировать в новую переменную

var t = JSON.parse(JSON.stringify(test));

Затем измените новый объект, как вам нужно

1 голос
/ 15 сентября 2010

Вам необходимо клонировать объект, чтобы вы могли изменить клон и оставить исходный файл без изменений ... Какой самый эффективный способ глубокого клонирования объекта в JavaScript?

1 голос
/ 15 сентября 2010

Чтобы скопировать произвольный объект в другую переменную, используйте функцию-прототип, подобную этой:

Object.prototype.clone = function() {
  var newObj = (this instanceof Array) ? [] : {};
  for (i in this) {
    if (i == 'clone') continue;
    if (this[i] && typeof this[i] == "object") {
      newObj[i] = this[i].clone();
    } else newObj[i] = this[i]
  } return newObj;
};

Использование:

var bar = foo.clone();

http://my.opera.com/GreyWyvern/blog/show.dml/1725165

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...