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

Javascript global array not visible in JSON result function

本文关键字:函数 结果 全局 数组 JSON Javascript      更新时间:2023-09-26

我有一个全局数组,在一个函数中我调用地理编码器 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);
}

知道为什么吗?谢谢。

TL;DR

为什么不使用 .each()?无论如何,您似乎都在使用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。如果是这种情况,您的错误会抱怨未定义locationsArrayproperty 0 of locationsArray

真正的问题是,您的回调引用了 for 循环范围内的i。在最后一次迭代之后,它实际上递增ilocationsArray.length。循环条件经过测试,失败,然后退出循环。但是,i仍然是locationsArray.length - 一个从未存在过的价值。(但是,在相关问题中,也可以在回调触发之前修改集合。

让我们举个例子:

var arr = [1,2,3];
for (var i = 0; i < arr.length; i++) {
  setTimeout(function() {
    console.log(i, arr, arr[i]);
  }, i * 100);
}

Chrome 控制台将显示以下内容:

> 3 [1, 2, 3] undefined
> 3 [1, 2, 3] undefined
> 3 [1, 2, 3] undefined

为了修复我们的示例,我们将"限定"对特定项目的引用并将其放在回调中。像这样:

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