为什么内联函数不捕获变量

时间:2015-06-02 23:50:35

标签: javascript google-maps-api-3

我希望在用户点击标记时调用回调。我已经发现,如果我使用内联定义函数,我想要使用的变量具有与上次使用的值相对应的值。在下面的代码中,它是<!DOCTYPE html> <html> <head> <meta name="viewport" content="initial-scale=1.0, user-scalable=no"> <meta charset="utf-8"> <title>Simple markers</title> <style> html, body, #map-canvas { height: 100%; margin: 0px; padding: 0px } </style> <script src="https://maps.googleapis.com/maps/api/js?v=3.exp&signed_in=true"></script> <script> var data = [ {Name: 'Limanowskiego 1', Lat: 53.785418, Long: 20.4907734}, {Name: 'Partyzantów 12', Lat: 53.782255, Long: 20.484778}]; function createCallback(p) { return function(e) { console.log(p); }; } function initialize() { var mapOptions = { zoom: 14, center: new google.maps.LatLng(53.785418, 20.4907734) }; var map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions); var infowindow = new google.maps.InfoWindow({ content: "test string" }); for (var i=0; i < data.length; i++) { var point = data[i]; var myLatlng = new google.maps.LatLng(point.Lat, point.Long); var marker = new google.maps.Marker({ position: myLatlng, map: map, title: point.Name, }); google.maps.event.addListener(marker, 'click', function(e) { console.log(point); }); } } google.maps.event.addDomListener(window, 'load', initialize); </script> </head> <body> <div id="map-canvas"></div> </body> </html> 数组的最后一个值。

    google.maps.event.addListener(marker, 'click', createCallback(point));

如果我通过以下方式替换侦听器注册:

{{1}}

它按预期工作。

1 个答案:

答案 0 :(得分:0)

我怀疑你在这里没有告诉匿名功能是什么意思。

google.maps.event.addListener(marker, 'click', function(e) {
      console.log(point); //point?? what point?
    });

您可以通过简单地相应调整参数来解决这个问题......

google.maps.event.addListener(marker, 'click', function(e, point) { //Oh, This point!
      console.log(point);
    });

如果您不明白为什么会这样,那是因为point在周围的函数中被声明为局部变量,而不是全局变量(这是最好的!)。

当您创建新的匿名函数时,它会创建自己的范围,并且对其他函数的point一无所知。要告诉匿名函数使用哪个点,您可以将其作为参数传递,因此我的答案就在上面。