【问题标题】:Attaching parameters with javascript closures to default parameters in anonymous functions将带有 javascript 闭包的参数附加到匿名函数中的默认参数
【发布时间】:2010-10-20 14:15:41
【问题描述】:

我想在循环运行时向 Google 地理编码器 API 调用添加一些额外的参数,但我不确定如何将闭包参数附加到它们的匿名函数中,该函数已经具有由调用 API。

例如:

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

我希望能够在传递的 geocoder.geocode() 匿名函数中使用 i 的值,但是如果我在第 4 行使用 }(i)); 进行了闭包,那么它将替换第一个参数,这会破坏地理编码器。

有没有办法可以使用闭包,或者将 i 的值传递给匿名函数?

实际上我想做的是:

geocoder.geocode({'address': address}, function(results, status, i) {
    alert(i); // 0, 1, 2, 3, 4
}(i));

但工作:-)

【问题讨论】:

    标签: javascript closures google-geocoder


    【解决方案1】:

    您可以直接从您的匿名函数(通过闭包)访问i,但您需要捕获它,以便每次调用geocode 都会获得自己的副本。像往常一样在 javascript 中,添加另一个函数就可以了。我重命名了外部 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);
    }
    

    【讨论】:

    • 更简单的解决方案!应该早点发帖
    • 我本来想说在外部范围和内部范围中使用 i 会让人感到困惑,但我看到你现在已经解决了这个问题,所以我会让你离开 :)
    • 我建议这个例子是最好的,因为其他的(它们更简单)在我的情况下不起作用:地理编码器回调函数中的 i 总是循环中的最后一个。我想,这取决于浏览器的异步特性。但是这个答案非常有效! +1!
    • 我知道这是旧的,但我想更正@Igor 关于范围和闭包的假设。它与“浏览器的异步特性”无关,而是因为每个创建的匿名函数在 exact same 范围内都有一个闭包;这意味着它们都引用相同的i,这是一个单一的数字。更多详情请阅读你不懂JS的this chapter
    • 为我工作!谢谢!
    【解决方案2】:
    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);
    }
    

    应该这样做……

    【讨论】:

    • 这么简单的答案。非常感谢:-)
    猜你喜欢
    • 1970-01-01
    • 2012-10-01
    • 2011-03-02
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    相关资源
    最近更新 更多