为什么函数返回本地JSON变量的值而不是全局?

时间:2010-09-15 16:47:57

标签: javascript json global-variables

我有一个全局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 个答案:

答案 0 :(得分:2)

之后,通过引用分配对象
var t=test;

变量ttest指的是同一个对象。您需要复制对象以获取您正在寻找的行为。由于您正在使用JSON,您可以序列化原始对象,然后重新解析为新变量

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

然后根据需要修改新对象

答案 1 :(得分:2)

var t = test不会创建对象的副本。它只是用另一个名称引用同一个对象。如果您希望复制对象,请考虑使用jQuery的$.extend()函数:

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

在该主题上,数组的等效代码如下:

var t = test.slice(0);

答案 2 :(得分:2)

在你的行上

var t=test;

您不是复制 test的内容,而是创建对相同内容的新引用。因此,对t内容的任何修改也会修改测试。

答案 3 :(得分:1)

要将任意对象复制到另一个变量,请使用类似这样的原型函数:

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

答案 4 :(得分:1)

您需要克隆该对象,以便您可以修改克隆并保留原始内容... What is the most efficient way to deep clone an object in JavaScript?