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

| 这是代码:
<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>
这是输出: 1)10010-zzzzz 2)10001-zzzzz 3)10002-zzzzz 如您所见,var地址输出正确的值,但是* var icon_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>
该脚本中的标记都是正确的邮政编码,但是它们都显示相同的图标(visitor_icon.png)!     
已邀请:
问题是您正在循环中创建函数。 JavaScript仅具有函数作用域,而没有块作用域。即您在循环中创建的变量在整个函数中仅存在一次,每次迭代仅改变值。 在计算
icon_img
的时间(在传递给
geocode
的回调中)时,外部for循环已完成,
icon_img
具有上一次迭代的值。它适用于
address
,因为它是在循环内而不是稍后进行求值的。 您必须“捕获”
icon_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
}
也许您需要更多的变量来执行此操作...不确定。     

要回复问题请先登录注册