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によって呼び出されるsuccess関数では、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 に答える