Javascript 为什么可以';我不能访问JS对象属性吗?

Javascript 为什么可以';我不能访问JS对象属性吗?,javascript,object,scope,Javascript,Object,Scope,我有以下功能: function getAggregateData(){ var sums = new Object(); $.getJSON("example.json.php", function(data) { //for each month c = 0; $.each(data, function(key, val, index) { //for each

我有以下功能:

function getAggregateData(){
        var sums = new Object();


    $.getJSON("example.json.php", function(data) {
           //for each month
           c = 0;
            $.each(data, function(key, val, index) {
                  //for each store
                $.each(val, function(key2, val2, index2) { 
                      if(c == 0){
                         sums[key2] = val2; 
                      }
                      else{
                         sums[key2] += val2; 
                      }

                });
                c++
            });

    })
    return sums;
}
我将其称为:

var totals = getAggregateData();
但当我写日志时,我完全被难住了:

console.log(totals)
显示如下对象:

    store1  500
    store2  900
    store3  750
    and so on and so forth...
但是当我执行
console.log(totals['store1')
时,我会被取消索引

我还尝试了
console.log(totals.store1)

console.log(总计[0].store1)


我遇到了某种类型的范围问题,或者我没有创建我认为是的对象。

看起来函数将返回一个空对象,因为它没有等待AJAX调用完成

如果您尝试在$.getJSON回调的最后一行执行console.log(totals.store1),您可能会得到一个结果

您需要将任何需要“example.json.php”数据的代码放入回调中,该回调仅在AJAX调用返回后运行

例如

鉴于:

{
    "1": {
        "store1": 2450,
        "store2": 1060,
        "store3": 310
    },
    "2": {
        "store1": 2460,
        "store2": 1760,
        "store3": 810
    }
};
如果要为每个存储添加结果,则此操作应该有效

/**
* This functions need to be called when we have the data
*/
function processSums(obj){
    console.log(obj);
}

function getAggregateData(){

    var sums = {};

    $.getJSON("example.json.php", function(data) {
            $.each(data, function() {
                $.each(this, function(key, val, index){                
                    sums[key] = sums[key] || 0;
                    sums[key] += val;               
                });
            });
            // 4910
            processSums(sums);
    });

    return sums;
}

getAggregateData();

正在运行的
console.log()
调用在哪里?来自服务器的原始JSON看起来如何?您应该避免使用Object.new,使用
var sums={}
。另外,您缺少
c
变量前面的var关键字。@quantas,就在var totals=getAggregateData()之后;我在我的Chrome控制台中生成了以下内容:这正是我所期望的。这表明您的AJAX调用很可能没有返回您所认为的结果。这确实有效。我之前的问题是范围问题。但范围问题继续困扰着我。我需要从外部轻松检索这些值。如果我传递对象to processAggregateData,当我需要将其输入到图表或其他位置时,如何访问say totals.store1?您可以通过将其附加到窗口对象(例如window.totals)将其保存到全局变量,这是一个很好的做法吗?我总是听说全局JS变量非常糟糕…如果有必要,我会这样做,但只是尝试总是这样改进…范围是我迄今为止最大的障碍。你可以创建一个对象,将这些函数作为方法,并将总计作为该对象的属性。我删除了它,因为它并没有真正解决核心问题,即计时问题,但它就在这里
/**
* This functions need to be called when we have the data
*/
function processSums(obj){
    console.log(obj);
}

function getAggregateData(){

    var sums = {};

    $.getJSON("example.json.php", function(data) {
            $.each(data, function() {
                $.each(this, function(key, val, index){                
                    sums[key] = sums[key] || 0;
                    sums[key] += val;               
                });
            });
            // 4910
            processSums(sums);
    });

    return sums;
}

getAggregateData();