我不明白为什么在函数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),为什么?他们不是指同一件事吗?
答案 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对此没有任何影响。