2012-10-03 3 views
2

약간의 문제가 있습니다. 나는 하나의 companys API를 가지고 일하고있다. 나는 활동을 요구하고 저에게 활동의 배열을 돌려 보낸다. 다음은 코드의 일부입니다.자바 스크립트 onclick은 for 루프를 사용하여 배열의 마지막 요소를 보여줍니다.

client.requestActivities(function(activities) { 
     if (activities.length > 0) { 
      for(i=0; i < activities.length; i++) { 
       var activity = activities[i]; 
       activity.onStart(function() { alert(i+ " started"); }); 
       activity.onCredit(function() { alert(i+ " credit"); }); 
       activity.onClose(function() { alert(i+ " close"); }); 
       activity.onFinish(function() { alert(i+ " finish"); }); 
          $('.Game-Screen-Footer').append('<div class="Game-Screen-Footer-Adv" id="foota'+i+'"><a href="javascript:;" ><img src="'+activity.image_url+'" alt="'+activity.display_text+'" width="190" height="110"></a></div>'); 
       document.getElementById('foota'+i+'').onclick = function() { 
       ARNO.box.show({html:'<div id="socialVibeFancyBox0"></div>', close: false, width:activity.window_width, height:activity.window_height, openjs: 
          function(){ 
           client.loadActivityIntoContainer(activity, 'socialVibeFancyBox0'); 
          } 
         }); 
      } 
     } 

}

구름이 함수는 3 개 요소 어레이를 다시 제공한다. 하지만 첫 번째 활동을 클릭하면 onStart는 나에게 경고 (0 start)하지만 경고 (4 start)는 i의 마지막 요소를 경고한다는 것을 의미합니다. 이 문제를 어떻게 해결해야합니까? 나는 많은 것들을 시도했지만, 해결책을 찾지 못했지만 어쩌면 나를 도울 수 있습니까?

답변

4

이것은 클로저 문제의 또 다른 경우입니다. 함수에 밖으로 for 루프의

for(i=0; i<activities.length; i++) { 
    (function(i) { 
     // your code here 
    })(i); 
} 
+0

@Kolnik : – hakre

0

이동 배짱이, 별도로 범위해야하는 값 전달이보십시오.

for(i=0; i < activities.length; i++) { 
    setUpActivity(i, activities[i]); 
} 

function setUpActivity(i, activity) { 

    activity.onStart(function() { alert(i+ " started"); }); 
    activity.onCredit(function() { alert(i+ " credit"); }); 
    activity.onClose(function() { alert(i+ " close"); }); 
    activity.onFinish(function() { alert(i+ " finish"); }); 
    ARNO.box.show({ 
     html:'<div id="socialVibeFancyBox0"></div>', 
     close: false, width:activity.window_width, 
     height:activity.window_height, 
     openjs:function(){ 
        client.loadActivityIntoContainer(activity, 'socialVibeFancyBox0'); 
       } 
      }); 
} 

함수 호출

새로운 변수 영역을 생성한다. 함수에서 작성된 모든 변수 또는 매개 변수는 자체 범위에 있고 동일한 범위에서 작성된 함수는 해당 변수에 대한 영구 참조를 갖습니다.

activities.forEach(function(v, i){ 
    // now 'i' will work anywhere within this scope 
}); 
0

당신이 IE8- 신경 쓰지 않는 경우

은 ES5 이미 forEach이 문제를 해결 흥미 롭 소리. 이 클로저 문제 *를 자세히 설명하는 참고 자료 Q & A가 필요합니까?
관련 문제