2


0

Google Language APIを使用したバッチ翻訳

GoogleのAJAX Language 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によって呼び出されるsuccess関数では、nは常にmycaptions.lengthと等しくなります。 これにより、mycaptions [n]が未定義として返されます(たとえば、「holaに翻訳されました」)。 これは何日も私を困惑させてきました(なぜループの終わりにいるかのようにコールバック関数内のnの値はなぜですか?)、そして答えはプログラミングの明らかなビットにあると推測しています取得しません。

1 Answer


1


これは、JavaScriptでクロージャーがどのように機能するかに関係しています。 JavaScriptがクロージャーを作成するとき、使用される変数はコピーされるのではなく参照されるため、匿名関数を作成するとき、 n`の値をコピーするのではなく、 n`への参照を保存します。 したがって、実際に呼び出されると、現在の値「n」(ループの最後に割り当てられる値)で実行されます。 回避策は、パラメータ「n」を取り、クロージャを返す関数を作成することです:

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

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