Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/80.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全局变量范围问题_Javascript_Jquery_Json_Scope - Fatal编程技术网

JavaScript全局变量范围问题

JavaScript全局变量范围问题,javascript,jquery,json,scope,Javascript,Jquery,Json,Scope,我不明白为什么specialArray没有将其值保留在$.getJSON之外。我想我了解范围,感谢您的帮助。它将值吐出到控制台,但一旦超出.getJSON,就会丢失这些值。有什么想法吗 var specialArray = []; var data, temp, regionArrayNumber; var numberOfRegions = 29; var chartData = []; $(document).ready(function() { // set up array of

我不明白为什么
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
var specialArray=[];
var数据、温度、区域阵列编号;
var numberOfRegions=29;
var chartData=[];
$(文档).ready(函数(){
//设置按区域id组织的对象数组
对于(var j=0;j
好消息是您对范围的理解很好:)

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

如果要对服务调用的结果执行操作,则该代码需要存在于回调函数内,或者由回调函数内的某个对象调用


getJSON和类似API之所以如此,是因为它们希望确保您的代码不会“挂起”,并在等待可能需要一段时间才能完成的操作时使浏览器无响应。一开始你的头脑有点复杂,但这是帮了你一个忙。

既然getJSON是异步的,那么该行中的SpecialRay可以是空的。这就解释了为什么外部:在内部之前进行日志记录。。。如何修复此问题,以便以后使用specialArray?数据可用,这取决于您如何定义“以后”:)如果您有一个用于单击按钮的事件处理程序,例如,在该处理程序中,您可以检查specialArray.length==0以查看是否已检索到数据,然后采取相应的行动。如果不希望用户在检索数据之前单击按钮,请先禁用该按钮,然后在getJSON回调中重新启用它。