在JavaScript中使用for的数组不会更改每个var

时间:2013-03-25 13:02:36

标签: javascript google-maps geocoding

嗨我在使用JavaScript的数组中遇到了一些麻烦。我们来看看:

var Villes = [
  ['Versailles+France', 'upr2.png'],
  ['Paris+France', 'upr5.png'],
  ['Bruxelle+Belgique', 'upr4.png'],
  ['Manchester+Angleterre', 'upr1.png'],
  ['Monaco+Monaco', 'upr3.png']
];

function initialize() {
  var mapOptions = {
    zoom: 5,
    center: new google.maps.LatLng(46.225453,2.219238),
    mapTypeId: google.maps.MapTypeId.ROADMAP
  };
  var map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions);
  var geocoder = new google.maps.Geocoder();
  for (var i = 0; i < Villes.length; i++) {
    var ville = Villes[i];
    geocoder.geocode( { 'address': ville[0]}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        var marker = new google.maps.Marker({position: results[0].geometry.location,map: map,icon: ville[1]});
        alert(ville[1] + status);
      } else {
        alert("Geocode n'a pas fonctionner. Erreur: " + status);
      }
    });
  }
}

我的地图附带了我的所有标记,但图标永远不会改变,如ville[1]是对upr3.png的静态调用我不习惯JS,这是我第一次看到它。

3 个答案:

答案 0 :(得分:1)

当您调用geocode的回调时,i的值为循环结束。

通常的通用解决方案是通过立即调用的函数表达式来保护它:

for (var i = 0; i < Villes.length; i++) {
     (function(ville){
        geocoder.geocode( { 'address': ville[0]}, function(results, status)
           ...
        });
     })(Villes[i]);
}

由于变量的范围是声明它的函数,这使得新变量ville不受循环变化的影响。

答案 1 :(得分:0)

问题是ville不是数组,因此在for循环结束时,ville只有初始数组中最后一项的值(png3)。您需要在将值设置为ville

后立即调用该函数

答案 2 :(得分:0)

geocode调用是异步的,这意味着您将遍历所有位置并发送请求,然后响应将到达。那时你已经完成了循环,ville变量的值是最后一个。

在循环中的代码周围放置一个函数表达式,以便每次迭代都有自己的变量副本:

for (var i = 0; i < Villes.length; i++) {

  (function(ville){

    geocoder.geocode( { 'address': ville[0]}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        var marker = new google.maps.Marker({position: results[0].geometry.location,map: map,icon: ville[1]});
        alert(ville[1] + status);
      } else {
        alert("Geocode n'a pas fonctionner. Erreur: " + status);
      }
    });

  })(Villes[i]);

}