javascript:从局部变量修改全局变量

时间:2014-08-24 11:04:30

标签: javascript function variables global-variables local-variables

我不明白为什么在函数change2中,控制台没有输出2,但未定义?

var users = {a:1, b:2};

function change1(people){
    people.c = {};
    var C = people.c;
    setTimeout(function(){        
        C.number = 2;
    }, 1000);
}

function change2(people){
    people.c = {};
    var C = people.c;
    setTimeout(function(){
        console.log(C.number);
    }, 2000);
}

change1(users);
change2(users); // undefined, why not 2?

但是,如果我在C.number的{​​{1}}内people.c.number替换setTimeout,它可以正常工作(输出2),为什么?他们不是指同一件事吗?

2 个答案:

答案 0 :(得分:3)

您的change1函数为people.c分配一个新对象,并将其存储在本地C变量中。 然后在change2中创建另一个新对象,store存储在people.c中。 所以people.c(或者更确切地说是users.c)现在拥有第二个对象。

1秒钟后,你的change1函数会创建一个"数字"第一个对象中的属性。 但是people.c已经拥有了第二个未经修改的对象。 因此,在另一个1秒后,change2试图找到"数字"第二个对象中没有这种属性的属性。

所以总之你应该删除

people.c = {};
来自change2的

所以请避免覆盖people.c属性。

答案 1 :(得分:1)

这是我的解释。在change1中,这将创建一个新对象,让我们将其称为object1,并在 local 变量C中保留一个引用:

  people.c = {};
  var C = people.c;

在change2中,让我们更改B中的C名称(以避免混淆)

people.c = {};
var B = people.c;

这会创建另一个新对象,我们称之为object2,它会覆盖people.c中的引用(所以people.c指向这个新对象)并存储对 local 变量B的引用。

因此,change1中的局部变量C指向object1,局部变量B指向object2,people.c指向object2。

C.number = 2

将在change1

中定义object1的number属性

同时

console.log(B.number) //console.log(C.number) in the original code

将尝试输出未定义的object2的属性。

基本上,change1中的C和change2中的C指向两个不同的对象。 setTimeout对此没有任何影响。