2010-12-05 36 views
0

我正在循環訪問一個url數組。每個人都從不同的域獲取一些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.'); 
    }); 
} 

回答

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

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