我有以下代码 - 它的意思是根据sql查询动态构建指向其他内容的链接列表。 sql中的记录包含一个形成为“itemX,itemY,Recipe-Z”的字段,其中最后一个元素是可选的 - 代码将每个列表元素提供给另一个sql查询,当它在最后一个中提供时(并获取null)它应该只打印出来。相反,当我运行它时,我一直在我想要的元素之前获取元素。只需在z中添加1就可以解决问题,但我想知道为什么会这样做。
$("#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>");
}
});
}
所以如果数据[9]是
“item3,item4,Recipe - 5g”
它将查询这些项目并吐出
“项目3 - 1g,项目4 - 2g,食谱 - 5g”
但如果在nullcase上我只使用componentslist [z],那就说
“项目3 - 1g,项目4 - 2g,项目4”
即使在循环中的那个点,z应该是2,而不是1。
答案 0 :(得分:1)
关闭变量用法是一个经典问题
$("#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)
}