无法在AJAX回调中访问全局数组

时间:2014-07-17 00:18:50

标签: javascript jquery ajax callback scope

我正在尝试访问$ .getJSON回调中的全局数组。出于某种原因,我可以访问数组以实际调用ajax请求,但它在回调中是未定义的。

JS

var toprint  = [
    {name: "Name", 
     year: "2014", 
     call: "http://api.call.com"},
     // etc.....
]


for(var i = 0; i < toprint.length; i++){


$.getJSON( toprint[i].call, function( data) { // toprint[i].call accessed fine
            // some code...

            // toprint[i] undefined below
            jsonPrint = "<div class='col'><h3>" + toprint[i].name + "</h3>" + toprint[i].year + "<ul>";
            // some code...
        });

}

我收到错误:

TypeError:  toprint[i] is undefined

这很奇怪,因为根据我读过的其他SO问题,我应该能够访问AJAX回调中的全局变量。

2 个答案:

答案 0 :(得分:1)

当你这样做时:

for(var i = 0; i < toprint.length; i++){
    $.getJSON( toprint[i].call, function( data) { // toprint[i].call accessed fine
        // The for loop is done and value of i === toprint.length
        // by the time this is executed
    });
}

$.getJSON是异步的,您的for循环在触发回调之前完成。循环完成后,i的值将为toprint.length。因此,如果toprint有3个项目,则回拨执行时i的值将为3。

回调尝试阅读不存在的toprint[3] toprint仅包含3个项目[0][1][2])。由于它不存在,toprint[3]会返回undefined并尝试从.name访问undefined,会提供您提到的类型错误。

答案 1 :(得分:1)

您可以访问全局数组。你的问题是你的循环变量i。在调用回调时,我可能会超出界限。在你的情况下,它是出界的。解决问题的方法是在循环中创建一个新的变量。 var currIdx = i;以及在回调函数中使用该变量,例如toprint[currIdx].name。不幸的是,我目前无法对此进行测试,但我相信如果您这样做,变量currIdx的值将绑定到您的回调函数。如果这不起作用,请尝试var currRec = toprint[i];并在回调函数中使用currRec.name。我其实更喜欢第二种方法。