Javascript循环-第二个变量未显示

Javascript循环-第二个变量未显示,javascript,arrays,multidimensional-array,Javascript,Arrays,Multidimensional Array,代码如下: <script type="text/javascript"> var offender_locations = [ ["10010", "xxxxx", 3], ["10001", "xxxxx", 2], ["10002", "zzzzz", 1] ]; for (i = 0; i < offender_locations.length; i++) { var address = offender_locations[

代码如下:

<script type="text/javascript">
  var offender_locations = [
    ["10010", "xxxxx", 3],
    ["10001", "xxxxx", 2],
    ["10002", "zzzzz", 1]
  ];
  for (i = 0; i < offender_locations.length; i++) {
    var address = offender_locations[i][0];
    var icon_img = offender_locations[i][1];
  }
</script>

var\u位置=[
[“10010”,“xxxxx”,3],
[“10001”,“xxxxx”,2],
[“10002”,“zzzzz”,1]
];
对于(i=0;i
这是输出:

1) 10010-zzzzz
2) 10001-zzzzz
3) 10002-zzzzz

正如您所看到的,var address输出正确的值,但是*var icon\u img*总是重复相同的值

我是一个Javascript初学者,我已经尝试了所有我能想到的方法,但我仍然得到同样的结果

另外,我已经将完整的脚本粘贴到这里:

<script type="text/javascript">
  var offender_locations = [
    ["10010", "offender_icon.png", 3],
    ["10001", "offender_icon.png", 2],
    ["10002", "visitor_icon.png", 1]
  ];
  var myOptions = {
    zoom: 10,
    center: latlng,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  };
  var map = new google.maps.Map(document.getElementById("map"), myOptions);
  var latlng = new google.maps.LatLng(0, 0);

  for (i = 0; i < offender_locations.length; i++) {
    var infowindow = new google.maps.InfoWindow();
    var geocoder_map = new google.maps.Geocoder();
    var address = offender_locations[i][0];
    var icon_img = offender_locations[i][1];
    geocoder_map.geocode({
      'address': address
    }, function (results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        map.setCenter(results[0].geometry.location);
        var marker = new google.maps.Marker({
          map: map,
          position: map.getCenter(),
          icon: icon_img
        });
        google.maps.event.addListener(marker, 'click', (function (marker, i) {
          return function () {
            infowindow.setContent(offender_locations[i][0]);
            infowindow.open(map, marker);
          }
        })(marker, i));
      } else {
        alert("The requested offender is not mappable !")
      };
    });
  }
</script>

var\u位置=[
[“10010”,“incriber_icon.png”,3],
[“10001”,“incriber_icon.png”,2],
[“10002”,“visitor\u icon.png”,1]
];
变量myOptions={
缩放:10,
中心:拉特林,
mapTypeId:google.maps.mapTypeId.ROADMAP
};
var map=new google.maps.map(document.getElementById(“map”),myOptions);
var latlng=新的google.maps.latlng(0,0);
对于(i=0;i

这个脚本中的标记都是@正确的邮政编码,但它们都显示相同的图标(visitor_icon.png)

问题在于您正在循环中创建函数。JavaScript只有函数作用域,没有块作用域。也就是说,在循环中创建的变量在整个函数中只存在一次,只是每次迭代的值都会发生变化

在计算
图标img
时(在传递给
地理编码的回调中),外部for循环已经完成,
图标img
具有上一次迭代的值。它适用于
地址
,因为它是在循环内部计算的,而不是在以后

您必须“捕获”图标img的当前值,您可以使用即时功能:

for (i = 0; i < offender_locations.length; i++) { 
    var infowindow   = new google.maps.InfoWindow(),
        geocoder_map = new google.maps.Geocoder(),
        address      = offender_locations[i][0],
        icon_img     = offender_locations[i][1];

    (function(addr, img) {  // <-- immediate function call
        geocoder_map.geocode({'address': addr}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                map.setCenter(results[0].geometry.location);
                var marker = new google.maps.Marker({
                    map: map,
                    position: map.getCenter(),
                    icon: img
                });
                google.maps.event.addListener(marker, 'click', function() {
                    infowindow.setContent(addr);
                    infowindow.open(map, marker);
                });
            } else {
                alert("The requested offender is not mappable !");
            }
        });
    }(address, icon_img)); // <-- immediate function call
}
(i=0;i var infowindow=new google.maps.infowindow(), geocoder_map=新的google.maps.geocoder(), 地址=犯罪地点[i][0], icon_img=违规者位置[i][1];
(function(addr,img){/问题在于您正在循环中创建一个函数。JavaScript只有函数作用域,而不是块作用域。也就是说,您在循环中创建的变量在整个函数中只存在一次,只是每次迭代的值都会更改

在计算
图标img
时(在传递给
地理编码的回调中),外部for循环已经完成,并且
图标img
具有上一次迭代的值。它适用于
地址
,因为它是在循环内部计算的,而不是稍后

您必须“捕获”图标img的当前值,您可以使用即时功能:

for (i = 0; i < offender_locations.length; i++) { 
    var infowindow   = new google.maps.InfoWindow(),
        geocoder_map = new google.maps.Geocoder(),
        address      = offender_locations[i][0],
        icon_img     = offender_locations[i][1];

    (function(addr, img) {  // <-- immediate function call
        geocoder_map.geocode({'address': addr}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                map.setCenter(results[0].geometry.location);
                var marker = new google.maps.Marker({
                    map: map,
                    position: map.getCenter(),
                    icon: img
                });
                google.maps.event.addListener(marker, 'click', function() {
                    infowindow.setContent(addr);
                    infowindow.open(map, marker);
                });
            } else {
                alert("The requested offender is not mappable !");
            }
        });
    }(address, icon_img)); // <-- immediate function call
}
(i=0;i var infowindow=new google.maps.infowindow(), geocoder_map=新的google.maps.geocoder(), 地址=犯罪地点[i][0], icon_img=违规者位置[i][1];

(功能(地址、img){//它对我有效……请显示您的输出。尝试使用简单警报框弹出值。您确定吗?对我来说,它不会这样做,并且按照预期工作:它在Firefox中也适用于我,您在哪里打印上述代码?我刚刚单独测试了代码,它确实有效。但是,在我的完整代码中,脚本不起作用。我猜问题一定出在其他地方。我已经在上面的帖子中包含了完整的脚本!谢谢大家!看看这个..工作正常:它对我有效…请给我看一下你的输出。试着用简单的警告框弹出值。你确定吗?对我来说,它没有这样做,并且按预期工作:它在Firefox中也对我有效,你在哪里打印我n以上代码?我刚刚单独测试了代码,它确实可以工作。但是,在我的完整代码中,脚本不起作用。我想问题一定出在其他地方。我已经在上面的帖子中包含了完整的脚本!谢谢大家!检查一下……工作正常:澄清一下(因为OP是JS noob):创建函数时,它捕获对创建函数时作用域中所有变量的引用。在原始代码中,即使您正在为循环中的每个迭代创建一个新的回调函数,它们都引用了icon_img持有的相同值,在调用这些回调时,icon_img最终会返回b不管最后设置的值是什么('zzzzz')。谢谢Felix和broofa!我会更改代码,如果我成功了,会告诉你们:)但是现在不应该有问题!@user668190:它做了一些进一步的更改。例如,我认为在分配
点击
处理程序时,您不需要立即使用函数。但是试试看……嗨,费利克斯,我刚刚将您的代码复制到我的代码中,目前效果非常好!我现在将再次查看并寻求一些改进在整个脚本中。再次感谢您的时间!如果您不介意的话,还有一件事:)我不确定,但以防您知道谷歌地图api