将带有javascript闭包的参数附加到匿名函数中的默认参数

将带有javascript闭包的参数附加到匿名函数中的默认参数,javascript,closures,google-geocoder,Javascript,Closures,Google Geocoder,在循环中运行Google geocoder API调用时,我想向其添加一些额外的参数,但不确定如何将闭包参数附加到其匿名函数中,该匿名函数已经具有调用传递给API的默认参数 例如: for(var i = 0; i < 5; i++) { geocoder.geocode({'address': address}, function(results, status) { // Geocoder stuff here }); } 但是正在工作:-)函数

在循环中运行Google geocoder API调用时,我想向其添加一些额外的参数,但不确定如何将闭包参数附加到其匿名函数中,该匿名函数已经具有调用传递给API的默认参数

例如:

for(var i = 0; i < 5; i++) {
     geocoder.geocode({'address': address}, function(results, status) {
         // Geocoder stuff here
     });
}
但是正在工作:-)

函数geouter(i){
geocoder.geocode({'address':address},函数(结果,状态){
//这里是地理编码器
//这可以访问外部函数中的i,该函数将绑定到
//循环每次迭代的不同i值
});
}
对于(变量i=0;i<5;i++){
地球外部(一);
}

如果这样做…

您可以直接从匿名函数(通过闭包)访问
i
,但您需要捕获它,以便对
geocode
的每次调用都有自己的副本。与javascript中的通常情况一样,添加另一个函数就可以了。我重命名了outer
I
变量以使其更清晰:

for(var iter = 0; iter < 5; iter++) {
    (function(i) {
        geocoder.geocode({'address': address}, function(results, status) {
            // Geocoder stuff here
            // you can freely access i here
        });
    })(iter);
}
for(var-iter=0;iter<5;iter++){
(职能(一){
geocoder.geocode({'address':address},函数(结果,状态){
//这里是地理编码器
//你可以在这里自由访问我
});
})(国际热核实验堆);
}

这么简单的答案。非常感谢:-)一个更简单的解决方案!本应发布soonerI想说在外部作用域和内部作用域中使用
i
会让人感到困惑,但我发现您现在已经解决了这一问题,所以我不打扰您:)我建议这个示例是最好的,因为其他示例(它们更简单)不要在我的情况下工作:geocoder回调函数中的i始终是循环中的最后一个。我想,这取决于浏览器的异步特性。但是这个答案非常有效+1.我知道这很古老,但我想纠正@Igor关于作用域和闭包的假设。它与“浏览器的异步性质”无关,而是因为每个创建的匿名函数在完全相同的范围内都有一个闭包;这意味着它们都引用相同的
i
,这是一个单一的数字。关于更多细节,请阅读你不知道JS为我工作!非常感谢。
function geoOuter(i) {
    geocoder.geocode({'address': address}, function(results, status) {
         // Geocoder stuff here
         // This has access to i in the outer function, which will be bound to
         // a different value of i for each iteration of the loop
     });
}

for(var i = 0; i < 5; i++) {
    geoOuter(i);
}
for(var iter = 0; iter < 5; iter++) {
    (function(i) {
        geocoder.geocode({'address': address}, function(results, status) {
            // Geocoder stuff here
            // you can freely access i here
        });
    })(iter);
}