我不明白为什么在函数change2
中,控制台没有输出2,而是undefined?
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
内将 C.number
替换为 people.c.number
,它有效(输出 2),为什么?他们指的不是同一件事吗?
最佳答案
您的 change1 函数将一个新对象分配给 people.c 并将其存储在本地 C 变量中。 然后在 change2 中创建另一个新对象并存储在 people.c 中。 所以 people.c(或者更确切地说 users.c)现在持有第二个对象。
1 秒后,您的 change1 函数在第一个对象中创建了一个“数字”属性。 但是 people.c 已经拥有第二个未修改的对象。 因此,又过了 1 秒后,change2 尝试在第二个对象中查找没有此类属性的“数字”属性。
所以简而言之,你应该删除
people.c = {};
从 change2 开始,因此避免覆盖 people.c 属性。
关于javascript:从局部变量修改全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25471037/