2010-08-02 121 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