for循环中的闭包 – 循环变量作为参数的回调

我在循环中使用jQuery“GET”从服务器获取几个结果。 我想将循环索引作为固定参数包含在回调中,但它不起作用。

(我遵循了本文关于如何做的建议。)

但是,我在回调中得到的值完全不是我所期望的 – 而不是每个循环索引值,它总是等于索引的退出值。

即。 这里的代码片段为每次回调执行打印出’16’。 如何让它打印1,2,3 …(我意识到订单可能不同,那很好)

除了下面的代码,我还尝试了几种方法来指定回调函数,例如。 function(data, textStatus) { return test(data, textStatus, idx); }, 'text'); 等等

这应该怎么样?

 function test(data, textStatus, siteNo) { console.log("siteNo=" + siteNo); } function loadConfigLists() { var siteReport; // retrieve site configuration jQuery.get("svGetSiteConfig.php", function(data, textStatus) { // retrieve port configuration for all sites for (var idx=1; idx<=15; idx++) { var probeIP = siteConfigArray[idx].siteIP; if (probeIP != "" && probeIP != null) jQuery.get("svGetPortInfo.php?svSiteIpAddr=" + probeIP+"&s="+idx, function(data, textStatus) { test(data, textStatus, idx); }, 'text'); else // IP value is blank siteConfigArray[idx].portManifest = null; } } }, 'text'); } 

这是一个非常标准的闭包问题。 当你这样做:

 function(data, textStatus) { test(data, textStatus, idx); } 

您绑定了对idx的引用,但没有绑定idx的值。 因此,当您的回调被调用时,循环将结束,并且在您绑定的所有回调中idx将为16。

通常的解决方案是通过函数调用强制评估idx

 function build_callback(idx) { return function(data, textStatus) { test(data, textStatus, idx); }; } // And then... jQuery.get("svGetPortInfo.php?svSiteIpAddr=" + probeIP+"&s="+idx, build_callback(idx), 'text'); 

如果要将所有函数保持在一起,还可以使用自执行函数内联函数:

 for (var idx=1; idx<=15; idx++) (function(idx) { var probeIP = siteConfigArray[idx].siteIP; if (probeIP != "" && probeIP != null) jQuery.get("svGetPortInfo.php?svSiteIpAddr=" + probeIP+"&s="+idx, function(data, textStatus) { test(data, textStatus, idx); }, 'text'); else // IP value is blank siteConfigArray[idx].portManifest = null; })(idx); 

函数调用在调用函数时为您提供idx的值,这是您想要的idx的值。