2010-08-02 7 views
2

Google AJAX Language API를 사용하여 배열의 각 값을 변환하려고합니다.Google 언어 API로 일괄 번역

for(var n=0; n < mytext.length; n++) { 
google.language.translate(mytext[n], originalLanguage, newLanguage, function(result){ 
    if(!result.error){ 
    document.getElementById("caption") += mytext[n]+" has been translated to "+result.translation; 
    } 
}) 
} 

이 올바르게 전체 어레이를 변환하지만 google.language.translate 호출 성공 함수에서, n은 항상 동일 mycaptions.length이다. 이로 인해 mycaptions [n]이 정의되지 않은 상태로 반환됩니다 (예 : "Hola로 번역되었습니다"). 이것은 며칠 동안 나를 당황하게했다. (왜 콜백 함수 안에있는 n의 값은 마치 루프의 끝 부분에있는 것처럼?) 나는 대답을 프로그램의 명백한 비트로 생각한다. 알았어.

답변

1

이것은 JavaScript에서 클로저가 작동하는 방식과 관련이 있습니다. 자바 스크립트가 클로저를 생성 할 때 사용되는 모든 변수는 복사되지 않고 참조되므로 익명 함수를 생성 할 때 n 값을 복사하는 대신 n에 대한 참조를 저장합니다. 따라서 실제로 호출 될 때 현재 값 n (루프 끝에 할당 된 값)로 실행됩니다. 해결 방법은 매개 변수 n을 사용하는 함수를 만들고 닫음을 반환하는 것입니다.

function createSuccessFunction(n) { 
    return function() { 
      // behavior on success 
    }; 
} 

// use createSuccessFunction(n) where you need a callback