内部的封闭for循环 - 回调与循环变量作为参数[复制]内部的封闭for循环 - 回调与循环变量作为

2019-05-12 11:11发布

这个问题已经在这里有一个答案:

  • JavaScript的闭包内环路-简单实用的例子 43个回答

我使用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'); 
}

Answer 1:

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

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是你想要的。



文章来源: closure inside a for loop - callback with loop variable as parameter [duplicate]