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

标签 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.');
    });
}

最佳答案

在 JavaScript 中,for 循环没有 block 作用域,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.');
  });
});
<小时/>

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);
}

关于javascript - 如何从回调中访问闭包变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4358270/

相关文章:

Javascript函数调用参数对象的成员

javascript - NodeJS : Very large JSON from remote resource parsing

javascript - Javascript 中带键盘的可导航菜单

javascript - 如何使用 Snap.svg 对加载的 SVG 内的路径变形进行动画处理?

javascript - 如何调用两个函数onClick()react/redux

javascript - 如何在按钮单击时显示不同的标题

android - 表单字段文件输入不会在 Android 上打开文件浏览器。仅相机可用

javascript - 等待文档 mousedown 完成,然后元素 onclick 才能开始

javascript - 使用网站输入运行 python 脚本

javascript - 在 Javascript 中如何检查数组是否包含具有相同字段的对象?