我正在尝试访问$ .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回调中的全局变量。
答案 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
。我其实更喜欢第二种方法。