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

标签 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[i][0];
    var icon_img = offender_locations[i][1];
  }
</script>

这是输出:

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

如您所见,var address 输出正确的值,但 *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 只有函数作用域,没有 block 作用域。 IE。您在循环中创建的变量在整个函数中只存在一次,只是值在每次迭代中发生变化。

在评估 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
}

也许您必须对更多变量执行此操作...不确定。

关于Javascript 循环 - 第二个变量不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5675801/

相关文章:

javascript - 是否可以在 Mousetracker 中进行输入?

javascript - rake 管道或 requirejs

C++ 冒泡排序

python - 用python中的另一个向量求和零和一

c - 字符串中的二维数组在 C 中创建错误输出

javascript - 谷歌地图身份验证不起作用,内容安全策略指令

javascript - 如何从 fetch 返回 ajax 结果

java - 从 java 集合中删除重复项

python - 如何创建多维 numpy 数组?

c - 在 C 中使用字符访问数组