javascript:在嵌套回调中访问循环计数器

时间:2011-01-04 12:11:55

标签: javascript callback

我正试图在嵌套回调中访问lopp索引。 这是代码:

gatherAddresses: function(){
    var divs = $('#searchResults .address');
    var addrs = [];
    for (var i = 0; i < divs.length; i++) {
        if (divs[i].className == 'address') {
            var address = $.trim($(divs[i]).html());
            var rel = divs[i].getAttribute('rel');
            results.addresses.push({
                address: address,
                rel: rel
            });
            results.geocoder.getLatLng(address, function(point){

                if (!point) {
                    alert(address + ' not found');
                }
                else {
                    var marker = new GMarker(point);

                    //chmurka :) 
                    GEvent.addListener(marker, "click", function(){

/////////////here I want the loop index

                        marker.openInfoWindowHtml("<b>""</b><br/>");
                    });
                    results.map.addOverlay(marker);
                    addrs.push({
                        rel: results.findRel(address),
                        point: point
                    });
                    results.findCenter(addrs, results.map);


                }
            });
        }
    }
},

我知道这一切都是为了理解回调和变量范围,但我请求你的帮助,因为这是我的第一个回调问题:)

2 个答案:

答案 0 :(得分:3)

由于闭包,你的回调已经可以访问i了,但它有一个变量的“引用”,因此值可能不是你想要的值,因为它总是最新的,最好的,如果您希望回调在调用iresults.geocoder.getLatLng使用值,则需要通过另一个匿名函数创建i的副本:

(function(e) { // get a copy of the value that WON'T change
  GEvent.addListener(marker, "click", function(){
     // use e here as the index
  });
})(i); // pass the value of i in

答案 1 :(得分:1)

GEvent.addListener(marker, "click", function (loopIndex) {
  return function () {
    // the variable "loopIndex" will have the value of i
    marker.openInfoWindowHtml("<b>""</b><br/>");
  }
}(i));