我不明白为什么在功能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?
然而,如果我用change1
的setTimeout
中的people.c.number
代替C.number
,它可以工作(输出2),为什么?它们不是指同样的东西吗?
您的change1函数将一个新对象分配给people.c,并将其存储在本地C变量中。然后在change2中创建另一个新对象并将其存储在people.c中。所以people.c(或者更确切地说是users.c)现在保存了第二个对象。
1秒后,你的change1函数在第一个对象中创建了一个"number"属性。但是people.c已经保存了第二个未修改的对象。因此,在另一个1秒后,change2尝试在第二个不具有number属性的对象中找到number属性。
所以简而言之你应该删除people.c = {};
from change2,避免重写people.c属性
这是我的解释。在change1中,这将创建一个新对象,我们将其命名为object1,并在本地变量C:
中保留一个引用。 people.c = {};
var C = people.c;
在change2中让我们改变B中C的名字(为了避免混淆)
people.c = {};
var B = people.c;
这将创建另一个新对象,我们称之为object2,它覆盖people.c中的引用(因此people.c指向这个新对象)并存储对本地变量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未定义的属性。
基本上C in change1和C in change2指向两个不同的对象。setTimeout在这里没有任何作用