Пакетный перевод с 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, 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
Другие вопросы по тегам