Javascript全局数组在JSON结果函数中不可见
我有一个全局数组,在一个函数中调用geocoder api。问题是数组在结果函数中不可见。 我收到错误消息:Javascript全局数组在JSON结果函数中不可见,javascript,arrays,json,global,Javascript,Arrays,Json,Global,我有一个全局数组,在一个函数中调用geocoder api。问题是数组在结果函数中不可见。 我收到错误消息: Uncaught TypeError: Cannot set property 'address' of undefined 代码如下: var locationsArray = new Array(); function GetAddress(){ for(var i=0;i<locationsArray.length;i++) $.getJSON("https:
Uncaught TypeError: Cannot set property 'address' of undefined
代码如下:
var locationsArray = new Array();
function GetAddress(){
for(var i=0;i<locationsArray.length;i++)
$.getJSON("https://maps.googleapis.com/maps/api/geocode/json?latlng="+locationsArray[i].position.lat()+','+locationsArray[i].position.lng(), function (result) {
locationsArray[i].address = result.results[0].formatted_address;
});
console.log(locationsArray);
}
var locationsArray=new Array();
函数GetAddress(){
对于(var i=0;iTL;DR
你为什么不使用?反正你似乎在使用jQuery
function GetAddress() {
$.each(loationsArray, function(i, v) {
$.getJSON("https://maps.googleapis.com/maps/api/geocode/json?latlng="
+ v.position.lat() + ',' + v.position.lng(),
function (result) {
v.address = result.results[0].formatted_address;
}
);
console.log(v);
});
}
…诚然未经测试。但是,如果我正确地“音译”了它,您的v
应该在该实现中正确地确定范围
并不是您的回调无法看到locationsArray
。如果是这种情况,您的错误将抱怨未定义locationsArray的locationsArray
或属性0
真正的问题是,您的回调引用了for循环作用域中的i
。在上一次迭代之后,它实际上将i
增加为locationsArray.length
。循环条件已测试,失败,循环退出。但是,i
仍然是locationsArray.length
——一个永远不会超过的值isted。(不过,在相关问题中,也可以在调用回调之前修改集合。)
让我们举一个例子:
var arr = [1,2,3];
for (var i = 0; i < arr.length; i++) {
setTimeout(function() {
console.log(i, arr, arr[i]);
}, i * 100);
}
为了修复我们的示例,我们将“范围外”一个对特定项的引用,并将其放入回调中
var arr = [1,2,3];
for (var i = 0; i < arr.length; i++) {
// create a scope
(function() {
var v = arr[i];
setTimeout(function() {
console.log(v);
}, i * 100);
})();
}
@scimonester可能重复:在这种情况下,我不这么认为。似乎OPs错误出现在回调中,而不是试图访问返回值。@MattBurland重新查找代码…我收回了CV。但可能OP删除了填充locationArray
的一些代码?修复了它,谢谢scimonester。@Scimonster你的第二个链接肯定达到了目标。投票关闭。。。
var arr = [1,2,3];
for (var i = 0; i < arr.length; i++) {
// create a scope
(function() {
var v = arr[i];
setTimeout(function() {
console.log(v);
}, i * 100);
})();
}
> 1
> 2
> 3