2

我的代码如下所示:

if (ACTIVETICKETS.length > 0) 
{
    for (var m in  ACTIVETICKETS) 
    {
        if (ACTIVETICKETS.hasOwnProperty(m)) 
        {
            var marker = new L.Marker(new L.LatLng(ACTIVETICKETS[m].location.x, ACTIVETICKETS[m].location.y));
            createHtmlForPopUp(m, function(data)
            {
                console.log(m);
                marker.bindPopup( data ); // calling a function with callback
                tile_layer.addLayer(marker);                           
            });
        }
    } // for loop ends here
}

在执行此操作时,我只得到 m 的最后一次迭代。ACTIVETICKETS 数组的总长度是 16。所以我只输入了 15 个 16 次

4

3 回答 3

2

下面的代码应该可以工作,但正如我上面评论的那样,请阅读关于闭包的内容,这样你就知道为什么了

    if (ACTIVETICKETS.length > 0) {
      for (var m in  ACTIVETICKETS) {
        (function(x) {
          if (ACTIVETICKETS.hasOwnProperty(x)) {
            var marker = new L.Marker(new L.LatLng(ACTIVETICKETS[x].location.x, ACTIVETICKETS[x].location.y));
              createHtmlForPopUp(x, function(data){
                console.log(x);
                marker.bindPopup( data ); // calling a function with callback
                tile_layer.addLayer(marker);
              });
          }
        })(m);
      } // for loop ends here
    }
于 2013-07-05T15:00:18.517 回答
1

您遇到的问题是 m 的值,在调用回调时,它是循环结束之一。一种解决方案是通过将其设置为立即调用函数中的变量值来保护该值:

for (var m in  ACTIVETICKETS) {
   (function(m){
        if (ACTIVETICKETS.hasOwnProperty(m)) 
        {
            var marker = new L.Marker(new L.LatLng(ACTIVETICKETS[m].location.x, ACTIVETICKETS[m].location.y));
            createHtmlForPopUp(m, function(data)
            {
                console.log(m);
                marker.bindPopup( data ); // calling a function with callback
                tile_layer.addLayer(marker);                           
            });
        }
    })(m);
 } // for loop ends here

这是因为 JavaScript 没有块作用域,只有在调用函数时才创建一个新的变量作用域。

您可以对命名函数使用相同的技术,而不是上面的内联函数:

function makeTicket(m){
  if (ACTIVETICKETS.hasOwnProperty(m)) 
  {
        var marker = new L.Marker(new L.LatLng(ACTIVETICKETS[m].location.x, ACTIVETICKETS[m].location.y));
        createHtmlForPopUp(m, function(data)
        {
            console.log(m);
            marker.bindPopup( data ); // calling a function with callback
            tile_layer.addLayer(marker);                           
        });
    }
}

然后这样做:

for (var m in  ACTIVETICKETS) {
    makeTicket(m)
} // for loop ends here

作为旁注,有非常令人信服的理由不在for-in数组上使用枚举,而是使用典型的for循环,并且您不需要外部 if 测试,因此您可以删除它并执行

for (var m =0; m<ACTIVETICKETS.length; m++) {
    makeTicket(m)
}
于 2013-07-05T15:00:29.863 回答
0

您需要为要在回调函数中访问的所有变量创建一个闭包。

    createHtmlForPopUp(m, (function (m, data, marker) {
        return function(data)

        {
            console.log(m);
            marker.bindPopup( data ); // calling a function with callback
            tile_layer.addLayer(marker);                           
        }
    })(m, data, marker));
于 2013-07-05T15:01:02.797 回答