проблема при передаче функции в качестве параметра в JavaScript - PullRequest
2 голосов
/ 24 мая 2011
function initialize(final) {
        /* ........ */
        var address_array = final.split('~');


        for (var count = 0; count < address_array.length; count++) 
        {
            if (geocoder) {
                geocoder.getLatLng(
                    address_array[count],
                    function (point) {
                        if (!point) {
                            alert(address_array[count] + " not found");
                        }

Все, что я хочу, это оповещение, чтобы работать здесь, в последней строке.

Предположим, что address_array имеет 3 значения, т.е. address_array.length равно 3. Но предупреждение всегда показывает undefined not found. Я предполагаю, что address_array[count] не может быть доступен из этой функции. Однако, когда я пытаюсь

alert(address_array.length + " not found"); 

это говорит 3 not found. пожалуйста, помогите.

Может кто-нибудь помочь мне с этим вопросом?

функция makeTheFunction (array, thisCount) { функция возврата (точка) { если (! точка) { alert (array [thisCount] + "not found"); }

          else {
              var marker = new GMarker(point);
              map.addOverlay(marker);
              GEvent.addListener(marker, "click", function () {
                  marker.openInfoWindowHtml(array[thisCount] + "</b>");
              });
          }
      };
  }

предупреждение (массив [thisCount] + "not found"); работает нормально, но, похоже, не работает, когда входит в раздел else ..marker.openInfoWindowHtml (array [thisCount] + "");

Ответы [ 2 ]

5 голосов
/ 24 мая 2011

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

То, что вы хотите сделать, - это создать функцию так, чтобы она закрывалась над чем-то, что не меняется.

var address_array = final.split('~');

for (var count = 0; count < address_array.length; count++) 
{
    if (geocoder) {
        geocoder.getLatLng(
            address_array[count],
            makeTheFunction(address_array, count)
        );
    }
}

function makeTheFunction(array, thisCount)
{
    return function(point) {
        if (!point) {
            alert(array[thisCount] + " not found");
        }
    };
}

Мы передаем и ссылку на массив, и значение count на каждой итерации цикла в makeTheFunction, который создает функцию как замыкание над ее аргументами и возвращает эту функцию. Теперь функция покажет правильную информацию, потому что информация, которую она закрывает, не меняется. Обратите внимание, что, как написано, makeTheFunction может быть вне любой другой функции, чтобы избежать закрытия замыкания над чем-либо еще.

Подробнее о замыканиях: Закрытия не сложны

1 голос
/ 24 мая 2011

Попробуйте:

function initialize(final) {
        /* ........ */
        var address_array = final.split('~');

        for (var count = 0; count < address_array.length; count++) 
        {
            doGeocode(address_array[count]);
        }
}

function doGeocode(value){
    if (geocoder) {
        geocoder.getLatLng(
        value,
        function (point) {
            if (!point) {
                alert(value + " not found");
            }
        }
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...