2010-12-05 9 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
당신의 for 루프에 대한 블록 범위가 없습니다 자바 스크립트에서

에서, domain 변수가 모든 루프를 공유, 당신이 닫는 } 후 액세스 할 수 있습니다 (예를 들어, 엄격 루프 내에서, 부모 함수로 범위 것 for()의 경우 마지막 루프에서 사용한 값이됩니다.)

이 문제를 해결하려면 자체 변수를 사용하여 추가 범위를 만들어야합니다.

$.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); 
} 
$.each()를 사용하여이 경우 가장 쉬운 방법입니다
관련 문제