3

我正在尝试利用 Google 的 AJAX 语言 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 值总是好像你在循环的末尾???),我猜答案在于我只是不知道的一个明显的编程不明白。

4

1 回答 1

1

这与闭包在 JavaScript 中的工作方式有关。当 JavaScript 创建一个闭包时,任何被使用的变量都会被引用,而不是被复制,所以当你构造匿名函数时,它会存储一个引用n而不是复制n. 因此,当它实际被调用时,它会以 的当前值运行n(这是在循环结束时分配给它的值)。解决方法是创建一个接受参数n并返回闭包的函数:

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

// use createSuccessFunction(n) where you need a callback
于 2010-08-02T23:59:05.280 回答