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

标签 javascript function variables global-variables local-variables

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

但是,如果我在 change1setTimeout 内将 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/

相关文章:

javascript - 在 TypeScript 中使用 JavaScript 库时不存在处理属性

javascript - 带有 JS 切换的纯 CSS 复选框不起作用

javascript - 我的购物车不会重置(javascript 函数)

c - 在 C 中,如果未明确编写,被调用函数是否会自动返回其被调用函数返回的值?

ios - Swift 如何在标签中的文本周围添加背景颜色?

javascript - 显示变量中的数据

javascript - 从下拉菜单切换类

javascript - 首先使用 groupBy,然后使用 lodash 根据名称对数组进行排序?

c - 查找重复整数的数组问题

c# - 如何在 C# 中添加外部文件的数据量(流读取器)