2010-08-02 222 views
2

我試圖利用Google的AJAX語言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中閉包的工作方式有關;當JavaScript創建一個閉包時,所有使用的變量都被引用,而不是被複制,所以當你構造匿名函數時,它會存儲對n的引用,而不是複製n的值。因此,當它實際被調用時,它將以當前值n(這是在循環結束時分配給它的值)運行。解決方法是創建一個函數,該函數採用參數n並返回一個閉包:

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

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