2015-11-20 3 views
0

Я пытаюсь создать интерактивные маркеры в картах Google. Вот массив для создания маркеров:Переменная область внутри петель в анонимной функции

var markers = [ 
    {"id":17,"ti":"33 Star Hotel","lat":3.14648,"lng":101.711,"ty":5,"lid":"3","desc":""}, 
    {"id":9,"ti":"Aquaria KLCC","lat":3.15392,"lng":101.713,"ty":10,"lid":"3","desc":""}, 
    {"id":28,"ti":"Batu Ferringhi","lat":5.47436,"lng":100.247,"ty":15,"lid":"4","desc":""}, 
]; 

Маркеры добавляются на карту п если маркеры идентификатора местоположения крышки равно п.

При нажатии маркеров, я хочу, чтобы маркеры индекс массива будут отображаться, но все они показывают конечное значение я (markers.length).

function map_center(n) { 
    for (var i = 0; i < markers.length; i++) { 
     if (markers[i].lid == n) { 
      var m = new google.maps.Marker({ 
       position: { lat: markers[i].lat, lng: markers[i].lng }, 
       map: map, 
       title: markers[i].ti, 
       icon: icons[markers[i].ty], 
      }); 
      m.addListener("click", function(){ 
       alert("click:" + i); 
      }); 
      markers[i].dom = m; 
     } 
    } 
} 

Как-то анонимная функция требует параметр, чтобы получить копию текущего значения я. Я нашел решение здесь на SO, и она работает, но я не люблю передавать параметры таким образом:

var m = new google.maps.Marker({ 
    position: { lat: markers[i].lat, lng: markers[i].lng }, 
    map: map, 
    title: markers[i].ti, 
    icon: icons[markers[i].ty], 
    i: i 
}); 
m.addListener("click", function(){ 
    alert("click:" + this.i); 
}); 

Как это должно быть сделано правильно?

+0

Спасибо @FelixKling! Я не знал причудливых слов, которые закрывали внутри петли! Это то, что я искал! –

ответ

1

Wrap все в iife

function map_center(n) { 
for (var i = 0; i < markers.length; i++) { 
    (function(i) { 
     if (markers[i].lid == n) { 
      var m = new google.maps.Marker({ 
       position: { lat: markers[i].lat, lng: markers[i].lng }, 
       map: map, 
       title: markers[i].ti, 
       icon: icons[markers[i].ty], 
      }); 
      m.addListener("click", function(){ 
       alert("click:" + i); 
      }); 
      markers[i].dom = m; 
     } 
    })(i) 
} 
Смежные вопросы