JavaScript中带有for的数组不会更改每个变量

JavaScript中带有for的数组不会更改每个变量,javascript,google-maps,geocoding,Javascript,Google Maps,Geocoding,嗨,我对JavaScript中带有for的数组有一些问题。我们来看看, var Villes = [ ['Versailles+France', 'upr2.png'], ['Paris+France', 'upr5.png'], ['Bruxelle+Belgique', 'upr4.png'], ['Manchester+Angleterre', 'upr1.png'], ['Monaco+Monaco', 'upr3.png'] ]; function initial

嗨,我对JavaScript中带有for的数组有一些问题。我们来看看,

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);
      }
    });
  }
}
var-Villes=[
[“凡尔赛+法国”,“upr2.png”],
[“巴黎+法国”,“upr5.png”],
['Bruxelle+Belgique','upr4.png'],
['Manchester+Angleterre','upr1.png'],
[“摩纳哥+摩纳哥”,“upr3.png']
];
函数初始化(){
变量映射选项={
缩放:5,
中心:新google.maps.LatLng(46.225453,2.219238),
mapTypeId:google.maps.mapTypeId.ROADMAP
};
var map=new google.maps.map(document.getElementById(“地图画布”),mapOptions);
var geocoder=new google.maps.geocoder();
对于(变量i=0;i

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

在调用
geocode
的回调时,
I
的值为循环结束

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

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

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

问题在于
ville
不是数组,所以在for循环完成时,
ville
只有初始数组中最后一项的值(png3)。您需要在将值设置为
ville

后立即调用该函数
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]);

}
for(变量i=0;i
请在发布之前格式化您的代码。。可能重复的Thx对于您的答案来说太多了,我真的不习惯使用异步效果;-)谢谢你的回答,我真的不习惯使用异步效果;-)谢谢你的回答,我真的不习惯使用异步效果;-)