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



我不明白为什么在功能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?

然而,如果我用change1setTimeout中的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在这里没有任何作用

相关内容

  • 没有找到相关文章

最新更新