事件监听器的有趣内存问题

时间:2015-01-08 06:51:32

标签: javascript google-maps google-maps-api-3

让我解释一下我的意思"记忆"。我有谷歌地图。我为地图制作了一系列标记,并为每个标记添加了监听器。

for( var venue in response.markers ){
    var loc = new google.maps.LatLng(response.markers[venue].GPSX, response.markers[venue].GPSY);
    var marker = new google.maps.Marker({
        position: loc,
        title: response.markers[venue].VenueName,
        map: map
    });

    google.maps.event.addListener(marker, 'click', function() {
        alert(venue);
    });
    markers.push(marker);
}

当点击标记时,场地具有许多响应标记的值。标记。如何让听众在创建时提醒或使用原始价值场所?例如,第一个标记应该警告0,第二个标记应该警告,依此类推。

2 个答案:

答案 0 :(得分:2)

在JavaScript中完成for循环后,变量仍然存在。但是他们被设定为他们最终得到的任何价值。因此,当最终调用click函数时,places是response.markers中的最后一项。

我会在函数上使用bind方法创建一个新函数,并在正确的时间绑定适当的参数。像这样:

function alertVenue(venue) {
    alert(venue);
}

for( var venue in response.markers ){

    // other stuff goes here

    google.maps.event.addListener(marker, 'click', alertVenue.bind(this, venue));
    markers.push(marker);
}

使用bind的好处是你的堆栈跟踪看起来更好(因为alertVenue是一个命名函数),并且很清楚当你读它时会发生什么。

答案 1 :(得分:1)

您可以执行以下操作:

google.maps.event.addListener(marker, 'click', (function(venue) {
        return function(){alert(venue)};
    }(venue)));

避免使用外部场地

进行关闭