动态json回调函数仅检索最后一个值

时间:2014-10-03 13:05:27

标签: javascript json

我试图将结果存储在数组中的json回调函数中。基本上我现在拥有的是存储的gps坐标数组,我正在迭代,对于每对坐标,我创建了一个向第三方发送请求的脚本。

int j = 0;
while(j < points.length-3)
{
   window['streetNames'+j] = function(json){
                             console.log("YO",j);
                             streetNames(json, j);
                             }; 

   var reverse = document.createElement('script'); 
   reverse.src = 'http://open.mapquestapi.com/nominatim/v1/reverse.php?format=json&json_callback=streetNames'+j+'&lat='+points[j]+'&lon='+points[j+1];
   document.getElementsByTagName('head')[0].appendChild(reverse);
   j = j + 2;
}

为了能够以正确的顺序存储结果,我必须将索引传递给回调函数,并且通过将j索引粘贴到函数名称来找到可能的唯一方法。

var streets = [];
function streetNames(json, t)
{
    console.log("in streetNames", t);
    streets[t] = json.address.road;
}

但是,在运行脚本之后,唯一添加到streets数组的实例是points数组中的最后一个,即最后一个索引。我的问题是,不应该所有的gps坐标运行窗口['streetNames'+ j] =函数(json)函数? 我做错了什么?

1 个答案:

答案 0 :(得分:3)

如重复问题的答案中所述,Javascript只有函数范围,而闭包则通过引用获取变量。这意味着所有闭包都会看到相同的j,最终会更新为循环设置的最后一个值。您应该使用bind。请注意,我还将int替换为var,并更改了streetNames的参数顺序。

var j = 0;
while(j < points.length-3)
{
   window['streetNames'+j] = streetNames.bind(this, j);
   // ...
}

var streets = [];
function streetNames(t, json)
{
    console.log("in streetNames", t);
    streets[t] = json.address.road;
}