您可以在循环中创建闭包;
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
变量被回调函数使用;正如你所发现的那样,在回调执行的时候已经移动了。上述两个解决方案为每次迭代创建另一个变量,正是这个回调操作。
为什么你把“(我)”在闭合(函数(我的结尾) – markzzz 2012-02-07 16:36:41
@markzzz:它调用函数马上和i'的'当前值传递给它的内部。关闭'i'是刚刚通过的本地参数,因此'i'的值不会改变。 – Matt 2012-02-07 16:37:44
呃...抱歉...我不明白'语法是什么类型(function(i ){}(i));'。是否(')'调用'(function(i){})'?:O – markzzz 2012-02-07 16:41:49