【问题标题】:JavaScript global var scope issue [duplicate]JavaScript全局变量范围问题[重复]
【发布时间】:2014-09-17 22:42:32
【问题描述】:

我不明白为什么specialArray 没有将其值保留在$.getJSON 之外。我以为我了解范围,任何帮助表示赞赏。它向控制台吐出值,但一旦超出.getJSON 就会丢失这些值。有什么想法吗?

var specialArray = [];
var data, temp, regionArrayNumber;
var numberOfRegions = 29;
var chartData = [];
$(document).ready(function() {

  // set up array of objects, organized by region_id
  for (var j = 0; j < numberOfRegions; j++) {
    temp = {
     "region_id" : (j + 1),
     "number_of_reads" : 0,
     "bus_count" : 0,
     "reads_per_bus" : 0
    };
    chartData.push(temp);
  }

  $.getJSON('https://data.cityofchicago.org/resource/historical-traffic-congestion-region.json', function(data) {

    // cycle through objects, add numbers to totals
    for (var i = 0; i < data.length; i++) {
      regionArrayNumber = data[i].region_id - 1;  // get region id, offset because of zero-based array
      chartData[regionArrayNumber].bus_count += parseInt(data[i].bus_count);
      chartData[regionArrayNumber].number_of_reads += parseInt(data[i].number_of_reads);
    }

    // calculate avg reads per bus
    for (var k = 0; k < chartData.length; k++) {
      chartData[k].reads_per_bus = (parseInt(data[k].number_of_reads)) / (parseInt(data[k].bus_count));
    }

    // set up array for google chart
    for (var x = 0; x < chartData.length; x++) {
      var tempArray = [];
      tempArray[0] = chartData[x].region_id;
      tempArray[1] = parseInt(chartData[x].number_of_reads);
      specialArray.push(tempArray);
      console.log("Inside: " + specialArray[x][0] + ", " + specialArray[x][1]);
    }
  });
console.log("Outside: " + specialArray[1][0]);


});  // end of doc.ready

【问题讨论】:

  • 由于 getJSON 是异步的,因此该行中的 specialArray 可以为空。

标签: javascript jquery json scope


【解决方案1】:

好消息是你理解范围就好了:)

getJSON 是一个异步函数...这意味着它将启动服务调用,继续执行下一条语句(即console.log("Outside: " + specialArray[1][0]);),然后当服务调用完成时,它将开始调用您的回调函数(你所谓的“内部”)。

如果您想对服务调用的结果进行操作,则该代码需要存在于回调函数中,或者由回调函数中的某些东西调用。

getJSON 和类似 API 之所以如此,是因为它们希望确保您的代码不会“挂起”,并使浏览器在等待可能需要一段时间才能完成的事情时无响应。一开始有点棘手,但它对你有帮助。

【讨论】:

  • 所以这解释了为什么 Outside: 在 Inside 之前记录...我该如何解决这个问题,以便以后可以使用 specialArray?
  • 数据可用,它仅取决于您如何定义“稍后”:) 例如,如果您有一个用于单击按钮的事件处理程序,则在该处理程序中您可以检查 specialArray.length== =0 以查看数据是否已被检索,然后采取相应措施。如果您不希望用户在检索到数据之前单击该按钮,请先禁用该按钮,然后在您的 getJSON 回调中重新启用它。
猜你喜欢
  • 2012-11-05
  • 1970-01-01
  • 2020-02-29
  • 2020-11-15
  • 1970-01-01
  • 2019-06-27
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
相关资源
最近更新 更多