Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript全局数组在JSON结果函数中不可见_Javascript_Arrays_Json_Global - Fatal编程技术网

Javascript全局数组在JSON结果函数中不可见

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:

我有一个全局数组,在一个函数中调用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://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