0

我有以下代码 - 它旨在根据 sql 查询动态构建指向其他事物的链接列表。sql 中的记录包含一个格式为“itemX,itemY,Recipe - Z”的字段,其中最后一个元素是可选的 - 代码将每个列表元素提供给另一个 sql 查询,并且当它提供最后一个元素时(并变为空)它应该只是把那块打印出来。相反,当我运行它时,我一直在获取我想要的元素之前的元素。只需将 1 添加到 z 即可解决问题,但我想知道它为什么这样做。

 $("#components").html("<span>BUILDS FROM</span>");
 var componentslist = data[9].split(", ");
 for (var z = 0; z < componentslist.length; z++){
   $.getJSON("items.php", {item:componentslist[z]}).done(function(internald){
     if(internald === null){
       $("#components").append("<br\><span>"+componentslist[z+1]+"</span>");
     } else {
       $("#components").append("<br\><span class=\"crosslink\" title=\""+internald[0]+"\">"+internald[1]+" - "+internald[2]+"</span>");
     }
   });
 }

所以如果 data[9] 是

“第 3 项,第 4 项,配方 - 5g”

它会查询这些项目并吐出

“项目 3 - 1g,项目 4 - 2g,配方 - 5g”

但如果在 nullcase 我只使用 componentslist[z] 它会说

“项目 3 - 1g,项目 4 - 2g,项目 4”

即使此时循环中的 z 应该是 2,而不是 1。

4

1 回答 1

1

It is a classic problem with closure variable usage

$("#components").html("<span>BUILDS FROM</span>");
var componentslist = data[9].split(", ");
for (var z = 0; z < componentslist.length; z++){
    (function(idx){
        $.getJSON("items.php", {item:componentslist[idx]}).done(function(internald){
            if(internald === null){
                $("#components").append("<br\><span>"+componentslist[idx+1]+"</span>");
            } else {
                $("#components").append("<br\><span class=\"crosslink\" title=\""+internald[0]+"\">"+internald[1]+" - "+internald[2]+"</span>");
            }
        });
    })(z)
}
于 2013-07-09T09:32:28.650 回答