我试图将结果存储在数组中的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)函数? 我做错了什么?
答案 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;
}