2012-09-24 1 views
2

for 루프에서 여러 번 콜백을받는 API 함수를 호출합니다. 콜백은 인덱스에 특정한 것을해야한다. willCallBack 함수 (API의 일부 임)를 변경할 수 없으며 전역 변수를 작성하지 않으려합니다.for 루프에서 인스턴스화 된 다중 콜백의 액세스 색인

다음 스 니펫은 문제를 보여줍니다. 첫 번째 for-loop는 첫 번째 시도이지만 모든 콜백에 대해 i == 4를 반환합니다. 두 번째 for-loop 작동 -하지만 추악하고 'hackish'라고 느낀다.

'i'값을 콜백 함수 정의로 가져 오는 더 깨끗한 방법은 무엇입니까?

var result = '', result2 = ''; 

// doesn't work; i == 4 for all 
for(var i=0; i<4; i++) { 
    willCallBack(function(msg) { 
     result += msg + i + '\n'; 
    }); 
} 

// works, but kinda ugly 
for(var i=0; i<4; i++) { 
    willCallBack(function(i) { 
     return function(msg) { 
      result2 += msg + i + '\n'; 
     }; 
    }(i)); 
} 

// part of API, cant change 
function willCallBack(cb) { 
    window.setTimeout(cb, 500, "can't change me"); 
} 

// show the results 
window.setTimeout(function(){ 
     alert(result + '\n\n' + result2) 
    }, 1000); 
+0

글쎄, 못 생겼지 만 내가 상상할 수있는 가장 짧은 해결책은 – DerWaldschrat

+1

아름다움은 보는 사람의 눈에, 추악한 작품은 ... – Ibu

답변

2

당신의 "좀 추한"버전에 대한 대안은 명명 된 함수가 대신 익명의 자기 실행 기능의 콜백을 반환하는 것입니다. 어쩌면 당신은 덜 추한 찾을거야?

for(var i=0; i<4; i++) { 
    willCallBack(createCallback(i)); 
} 

function createCallback(index) { 
    return function(msg) { 
     result2 += msg + index + '\n'; 
    }; 
}