在Javascript中将函数作为参数传递时出现问题

时间:2011-05-24 09:11:33

标签: javascript google-maps

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。请帮忙。

有人可以帮我解决这个问题吗?

function makeTheFunction(array,thisCount){           返回函数(点){               if(!point){                   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] +“未找到”);工作正常,但它进入其他部分似乎工作..marker.openInfoWindowHtml(array [thisCount] +“”);

2 个答案:

答案 0 :(得分:5)

这是因为你的函数是count变量的闭包,闭包得到持久引用到变量,而不是 copy 的值在定义函数时。因此,函数的所有副本在循环结束时都会看到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可以在任何其他函数之外,以避免闭包关闭其他任何函数。

有关闭包的更多信息:Closures are not complicated

答案 1 :(得分:1)

尝试:

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");
            }
        }
     }
}