我正在尝试使用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的值总是好像你在循环的结尾?),我猜测答案在于一个明显的编程我只是穿上得到。
答案 0 :(得分:1)
这与JavaScript中的闭包工作方式有关;当JavaScript创建一个闭包时,任何使用的变量都会被引用而不是复制,所以当你构造匿名函数时,它会存储对n
的引用,而不是复制n
的值。因此,当它实际被调用时,它将以当前值n
运行(这是在循环结束时分配给它的值)。解决方法是创建一个带参数n
并返回闭包的函数:
function createSuccessFunction(n) {
return function() {
// behavior on success
};
}
// use createSuccessFunction(n) where you need a callback