2012-02-07 21 views
4

我有这样的代码:如何在循环回调中引用`i`的正确值?

for (var i = 0; i < result.length; i++) { 
    // call a function that open a new "thread" 
    myObject.geocode({ param1: "param" }, function(results, status) { 
     alert(result.title[i]); 
    });            
} 

.geocode功能(即不是我的,所以我不能编辑)打开一个新的执行“线程”。

当我尝试在每一步中打印标题时,总会得到最后一个可能的值i

对于每次迭代,我如何保持对i的正确值的引用?

回答

5

您可以在循环中创建闭包;

for (var i = 0; i < result.length; i++) { 
    // call a function that open a new "thread" 
    (function (i) { 
     myObject.geocode({ param1: "param" }, function(results, status) { 
      alert(result.title[i]); 
     }); 
    }(i));            
} 

所以我们在这里创建一个函数;

(function (i) { 
    myObject.geocode({ param1: "param" }, function(results, status) { 
     alert(result.title[i]); 
    }); 
}); 

...它接受名为i的一个参数,并启动地理编码请求。通过将(i)添加到函数表达式声明的末尾,我们立即运行函数并将其当前值传递给i

(function (i) { 
    myObject.geocode({ param1: "param" }, function(results, status) { 
     alert(result.title[i]); 
    }); 
}(i)); 

不要紧一个变量i已经存在在比闭合更高的范围,因为i重写它的局部声明。无论是我们通过的变量的闭包,还是关闭调用变量的名称都可能不同;

(function (anotherVariable) { 
    myObject.geocode({ param1: "param" }, function(results, status) { 
     alert(result.title[anotherVariable]); 
    }); 
}(aVariable)); 

或者你也可以提取逻辑到另一个功能(我喜欢它,但它不太):

function geocode(i) { 
    myObject.geocode({ param1: "param" }, function(results, status) { 
     alert(result.title[i]); 
    }); 
} 

for (var i = 0; i < result.length; i++) { 
    geocode(i);            
} 

的问题是下到相同i变量被回调函数使用;正如你所发现的那样,在回调执行的时候已经移动了。上述两个解决方案为每次迭代创建另一个变量,正是这个回调操作。

+0

为什么你把“(我)”在闭合(函数(我的结尾) – markzzz 2012-02-07 16:36:41

+0

@markzzz:它调用函数马上和i'的'当前值传递给它的内部。关闭'i'是刚刚通过的本地参数,因此'i'的值不会改变。 – Matt 2012-02-07 16:37:44

+0

呃...抱歉...我不明白'语法是什么类型(function(i ){}(i));'。是否(')'调用'(function(i){})'?:O – markzzz 2012-02-07 16:41:49

2

请参阅JavaScript closure inside loops了解您的代码无法工作的原因。

for (var i = 0; i < result.length; i++) { 
    var callback = (function(i) { 
     return function(results, status) { 
      alert(result.title[i]); 
     }; 
    })(i); 

    myObject.geocode({ param1: "param" }, callback); 
} 
+0

其结果赋给'callback'变量的函数中的''i'变量未定义。因为你的代码实际上是这样的:'alert(result.title [undefined])'。 – Tadeck 2012-02-07 16:30:31

+0

对不起,错过了'我'。感谢您的提醒! – 2012-02-07 16:31:07

相关问题