Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 关于关闭/范围的混淆_Javascript_Jquery - Fatal编程技术网

Javascript 关于关闭/范围的混淆

Javascript 关于关闭/范围的混淆,javascript,jquery,Javascript,Jquery,今天在使用一些JS时,我的代码中有一个bug。我能够解决它,但我真的不明白为什么我所做的改变奏效。我所能猜到的是,它可以归结为闭包或变量范围 我试图构建一个嵌套的数组散列,如下所示: var maxNumberOfPairs = 2; var container = {}; var pairsHash = {}; $.each(["nurse", "doctor", "janitor", "chef", "surgeon"], function(index, role) { fo

今天在使用一些JS时,我的代码中有一个bug。我能够解决它,但我真的不明白为什么我所做的改变奏效。我所能猜到的是,它可以归结为闭包或变量范围

我试图构建一个嵌套的数组散列,如下所示:

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;
});
var maxNumberOfPairs=2;
var容器={};
var pairsHash={};
$。每个([“护士”、“医生”、“看门人”、“厨师”、“外科医生]),职能(索引、角色){
对于(变量i=0;i
如果你运行这个程序,你会在
容器中得到一个很好的嵌套输出,但是当你查看散列中的每个数组时,你会发现生成的字符串有一种奇怪的行为

每个字符串中都有最后一个角色,如下所示: “属性\u 0 \u外科医生\u夜间”

如果注销变量
pairIdSubString
,则该变量在字符串中的角色正确,但一旦将该变量添加到
pairHash
中,它将只使用
$中的最后一个元素。每个
数组

我可以通过在
$内移动
pairsHash
来修复它。每个
都在
for
循环之外

有谁能向我解释一下,为什么在将输出移动到每个容器中后,输出会有所不同


谢谢

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

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


为了进一步澄清所有对象都只是JavaScript中对内存地址的引用,所以为了获得新的内存地址,您需要初始化或通过值传递给函数克隆它

为了澄清,您以前有container[role]=pairsHash;除了$.each?之外,还有一件事需要澄清,即使它看起来像是一个数组,但它是一个对象。所有数组都是对象,因此它们也总是通过引用传递,但这两个变量都只是对象。有些人在使用for变量i时也遇到了这个问题:)