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

sco*_*oby 2 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");
                        }
Run Code Online (Sandbox Code Playgroud)

我想要的只是在这里工作的警报,在最后一行.

假设address_array有3个值,即为address_array.length3.但警报始终显示undefined not found.我假设address_array[count]无法从此功能访问.但是,当我尝试

alert(address_array.length + " not found"); 
Run Code Online (Sandbox Code Playgroud)

它说3 not found.请帮忙.

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

function makeTheFunction(array,thisCount){return function(point){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>");
              });
          }
      };
  }
Run Code Online (Sandbox Code Playgroud)

警报(array [thisCount] +"not found"); 工作正常,但它进入else部分似乎工作..marker.openInfoWindowHtml(array [thisCount] +"");

T.J*_*der 5

发生这种情况是因为您的函数是对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");
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

我们传递数组引用和循环的每次迭代时的count makeTheFunction,这将函数作为其参数的闭包创建并返回该函数.现在该函数将显示正确的信息,因为它关闭的信息不会改变.注意,如所写的,makeTheFunction可以在任何其他函数之外,以避免闭包闭合其他任何东西.

关于闭包的更多信息:闭包并不复杂