Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用回调函数在google地图上放置多个标记_Javascript_Google Maps_Google Maps Api 3 - Fatal编程技术网

Javascript 使用回调函数在google地图上放置多个标记

Javascript 使用回调函数在google地图上放置多个标记,javascript,google-maps,google-maps-api-3,Javascript,Google Maps,Google Maps Api 3,我想在GMAPAPI上实现一个功能,如果缩放超过17,则显示所有标记(否则,只需隐藏它们)。然而,当我编写下面这样的代码时,它就是不起作用 PS:代码的语法和排列可能不完全正确,但它表达了我的意思 // @latlong is an array of tuple (latitude , longtitude) // @myMap is the google map object passed to the function function placeMarker( myMap , latlon

我想在GMAPAPI上实现一个功能,如果缩放超过17,则显示所有标记(否则,只需隐藏它们)。然而,当我编写下面这样的代码时,它就是不起作用

PS:代码的语法和排列可能不完全正确,但它表达了我的意思

// @latlong is an array of tuple (latitude , longtitude)
// @myMap is the google map object passed to the function
function placeMarker( myMap , latlon)
{
  for(var i = 0 ; i < latlon.length ; i ++)
  {
     myMarker = new google.maps.Marker( {
        position: new google.maps.LatLng(latlon[i][0], latlon[i][1])
     });

     google.maps.event.addListener(myMap, 'zoom_changed', function() {
      zoomLevel = myMap.getZoom()       
      if(zoomLevel >= 17)
      {
        myMarker.setMap(myMap)
      }
      else
      {
        myMarker.setMap(null)
      }
  });


}
}
/@latlong是一个元组数组(纬度、长度)
//@myMap是传递给函数的google map对象
功能位置标记(myMap,latlon)
{
对于(变量i=0;i=17)
{
myMarker.setMap(myMap)
}
其他的
{
myMarker.setMap(空)
}
});
}
}
我只需将代码更改为:

function placeMarker( myMap , latlon)
{
  for(var i = 0 ; i < latlon.length ; i ++)
  {
     myMarker = new google.maps.Marker( {
        position: new google.maps.LatLng(latlon[i][0], latlon[i][1])
     });

     (function(myMarker_copy){
         google.maps.event.addListener(myMap, 'zoom_changed', function() {
          zoomLevel = myMap.getZoom()       
          if(zoomLevel >= 17)
          {
            myMarker_copy.setMap(myMap)
          }
          else
          {
            myMarker_copy.setMap(null)
          }
      });
      }(myMarker));


}
}
函数placeMarker(myMap,latlon)
{
对于(变量i=0;i=17)
{
myMarker_copy.setMap(myMap)
}
其他的
{
myMarker_copy.setMap(空)
}
});
}(我的标记);
}
}
第二个版本可以工作。 我知道如何使它工作,但是,我真的不知道为什么它工作,为什么其他没有。也许这与JS的函数闭包或参数传递原理有关(我查阅了很多参考文献,但其中一些只是持有不同的观点)。谁能帮我一个忙吗


非常感谢。

第一个不起作用的示例:有一个全局变量
myMarker
和许多事件侦听器,它们最终都对一个标记进行操作,而这个标记是在循环中最后创建的


第二个确实有效的示例:由于闭包,每个事件侦听器都会接收自己的标记变量的本地副本。因此,当调用事件侦听器时,它具有正确的标记值。

如果latlon变量是一个元组数组,那么latlon[0]和latlon[1]都是元组。您需要向标记构造函数传递元组值,而不是元组本身。position:
position:new google.maps.LatLng(latlon[i][0],latlon[i][1])
是的,这是一个打字错误,我已经修改了,是的,但我认为JS会通过引用而不是深度复制传递myMarkder变量……所以如果你说这是因为函数的关闭,那么参数myMarker_copy仍然应该指向同一个对象,我认为这是因为函数参数是按值传递的。即使对于对象,它们似乎是通过引用传递的。但它们仍然是通过值传递的。内部函数(在本例中为事件处理程序)可以访问在其中定义的函数的参数和变量(函数可以访问创建它的上下文)。事件处理函数绑定到传入的对象,而不是在封闭函数外部定义的对象。好吧~仍然有点混淆js函数参数的传递…但是无论如何,你帮了很多忙