关闭/范围的混乱

时间:2015-10-09 20:50:24

标签: javascript jquery

今天在使用某些JS时,我的代码中出现了一个错误。我能够解决它,但我真的不明白为什么我所做的改变有效。我只能猜到它归结为闭包或变量范围。

我试图像这样建立一个嵌套的数组哈希:

var maxNumberOfPairs = 2;
var container = {};
var pairsHash = {};
$.each(["nurse", "doctor", "janitor", "chef", "surgeon"],     function(index, role) {
    for(var i = 0; i < maxNumberOfPairs; i++){
        var pairIdSubString = "attribute_" + i + "_" + role;
        pairsHash["attribute_" + i] = [pairIdSubString + "_night", pairIdSubString + "_day"];
    }
    container [role] = pairsHash;
});

如果你运行这个,你会在container内得到一个很好的嵌套输出,但是当你看到散列中的每个数组时,你会得到一个奇怪的行为。

每个字符串在每个字符串中都有最后一个角色,如下所示: “attribute_0_的外科医生 _night”

如果您注销变量pairIdSubString,它在字符串中正确地具有该角色,但只要将其添加到pairHash,它就会使用$.each数组中的最后一个元素

我可以通过pairsHash移动$.each但在for循环之外来修复它。

任何人都可以向我解释为什么在将它们移到每个内部之后输出会有所不同吗?

由于

1 个答案:

答案 0 :(得分:1)

它实际上与参考值和值有关。当它在每个外面你反复操作同一个对象时,每次将它设置到容器时,你只是设置对不断变化的同一个对象的引用。因此,循环之后容器中的每个引用都是pairsHash的最后一个状态,因为它们都指向同一个对象。

当你将pairsHash放在每个中时,它每次重新初始化,所以它们都指向不同的内存地址。不一样,因为每个循环都会创建一个新的。

进一步阐明所有对象只是对内存地址的引用在JavaScript中,为了获得新的对象,您需要初始化或将值传递给函数克隆它。