如何从回调中访问闭包变量

Sys*_*ral 0 javascript jquery

我循环遍历一系列网址.每个人从不同的域中获取一些jsonp数据.成功处理程序需要能够访问原始循环中的数据,但是当从回调调用时,它始终是最后一个值,而不是调用ajax函数时设置的值.如何访问或将此值传递给回调?

for(var site in data.sites){
    var domain =  data.sites[site].domain;
    $('#site-logout').append('<div class="processing" id="' + domain.replace(".","-") + '"><strong>' + domain + '</strong> is logging out.');
    $.getJSON(url, function(data){
        if(data.success == true)
            $("#" +  domain.replace(".","-")).removeClass("processing").addClass("processed").html('<strong>' + domain + '</strong> has logged out.');
        else
            $("#" +  site.domain.replace(".","-")).removeClass("processing").addClass("error").text('<strong><a href="http://' + domain + '">' + domain + '</a></strong> has failed to log out. Follow the link to try manually.');
    });
}
Run Code Online (Sandbox Code Playgroud)

Nic*_*ver 5

在JavaScript中有对你没有块范围for循环中,domain变量是所有环路的共享,它的作用范围是父功能,而不是严格的循环中(例如,你可以在闭幕后访问它 }for(),它会是价值它在最后一个循环中).

要解决此问题,您需要使用自己的变量创建一个额外的范围; $.each()在这种情况下使用最简单:

$.each(data.sites, function(i, site){
  var domain = site.domain;
  $('#site-logout').append('<div class="processing" id="' + domain.replace(".","-") + '"><strong>' + domain + '</strong> is logging out.');
  $.getJSON(url, function(data){
    if(data.success == true)
        $("#" + domain.replace(".","-")).removeClass("processing").addClass("processed").html('<strong>' + domain + '</strong> has logged out.');
    else
        $("#" + domain.replace(".","-")).removeClass("processing").addClass("error").text('<strong><a href="http://' + domain + '">' + domain + '</a></strong> has failed to log out. Follow the link to try manually.');
  });
});
Run Code Online (Sandbox Code Playgroud)

for环路的方法是这样的:

for(var site in data.sites){
  (function(domain) {
    $('#site-logout').append('<div class="processing" id="' + domain.replace(".","-") + '"><strong>' + domain + '</strong> is logging out.');
    $.getJSON(url, function(data){
        if(data.success == true)
            $("#" +  domain.replace(".","-")).removeClass("processing").addClass("processed").html('<strong>' + domain + '</strong> has logged out.');
        else
            $("#" + domain.replace(".","-")).removeClass("processing").addClass("error").text('<strong><a href="http://' + domain + '">' + domain + '</a></strong> has failed to log out. Follow the link to try manually.');
    });
  })(data.sites[site].domain);
}
Run Code Online (Sandbox Code Playgroud)