Встроенная функция и глобальная переменная проблема в Javascript - PullRequest
2 голосов
/ 31 мая 2010

У меня есть код здесь: http://bitbucket.org/natim/lo53_tp1/src/tip/part3/camions/medias/js/tracking.js

Это я использую, чтобы получить некоторую информацию о направлении грузовых автомобилей.

Проблема возникает из функции, определенной в цикле for, как этот:

...

for(i = 0; i < nb_trucks; i++)
{
    ...

    contentString = '<div id="content">'+ trucks[i]['name'] + '</div>';

    current_window = new google.maps.InfoWindow({
        content: contentString
    });            

    infosWindow.push(current_window);

    current_marker = new google.maps.Marker({
        map: map,
        position: new google.maps.LatLng(trucks[i]['end']['lat'], trucks[i]['end']['lon']),
        draggable: false,
        title: trucks[i]['name']
    });
    markers.push(current_marker);

    google.maps.event.addListener(current_marker, 'click', function() {
        current_window.open(map, current_marker);
    });
}

В этом коде вы видите последний блок

    google.maps.event.addListener(current_marker, 'click', function() {
        current_window.open(map, current_marker);
    });

И моя проблема в том, что current_marker в параметрах addListener отличается от того, что внутри функции.

Current_window и current_marker внутри функции переопределяются при каждом повороте цикла.

Как я могу сделать это правильно?

Спасибо

1 Ответ

4 голосов
/ 31 мая 2010

Оберните его в замыкание (только этот небольшой раздел, никаких других изменений), чтобы вы получили нужную переменную, например:

(function(marker) { //a copy is passed, accessible as marker inside this function
  google.maps.event.addListener(marker, 'click', function() {
    current_window.open(map, marker);
  });
})(current_marker); //pass in the current value

Это не относится к той же переменной, которая изменяет каждый цикл, ее копия передается в замыкание, поэтому каждый раз, когда вы запускаете это, она получает копию того, что current_marker равно того времени передал. Если вам более любопытно, есть несколько замечательных ответов, объясняющих закрытие в этом вопросе .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...