使用索引在for循环中创建函数

时间:2014-10-12 05:14:46

标签: javascript angularjs angular-google-maps

我正在尝试在for循环中创建一个对象,并在循环中添加一个click函数,它可以调用另一个函数并传入索引 - 这样我就知道它被点击了哪个对象。这是循环:

        var markers = [];
        for (x = 0; x < response.data.length; x++) {
            var ret = {
                onClicked: function () { onMarkerClicked(x); },
                locationId: response.data[x].CASO_nid,
                id: x,  //-shows proper index
                latitude: response.data[x].Latitude,
                longitude: response.data[x].Longitude,
                title: x,  // shows proper index
                showWindow: false,
                fit: true
            };
            markers.push(ret);

        }
        $scope.results = markers;

现在,当我查看在控制台中创建的对象时,我发现我添加x的每个地方都已正确设置,除了点击功能外,只有x。问题是,当我在创建它之后单击该对象时,它们都将x作为它设置的最后一个数字。如何编写此函数以正确获取ndex,而不仅仅是最终的数字??

 see in console:


 0:  
Objectfit:
trueid: 0 
idKey: 0 
latitude: 42.0230636
locationId:10299 
longitude: -87.9620276
 onClicked: function () { onMarkerClicked(x); }
 showWindow: false
 title: 0

1 个答案:

答案 0 :(得分:2)

尝试为每个循环创建闭包:

for (index = 0; index < response.data.length; index++) {
     (function(x) {
            var ret = {
                onClicked: function () { onMarkerClicked(x); },
                locationId: response.data[x].CASO_nid,
                id: x,  //-shows proper index
                latitude: response.data[x].Latitude,
                longitude: response.data[x].Longitude,
                title: x,  // shows proper index
                showWindow: false,
                fit: true
            };
            markers.push(ret);
      }(index))
 }

另一种使用forEach的解决方案也会产生闭包。

response.data.forEach(function (value, x){
    var ret = {
                onClicked: function () { onMarkerClicked(x); },
                locationId: value.CASO_nid,
                id: x,  //-shows proper index
                latitude: value.Latitude,
                longitude: value.Longitude,
                title: x,  // shows proper index
                showWindow: false,
                fit: true
            };
        markers.push(ret);
});