【问题标题】:Unable to access global array in AJAX callback无法在 AJAX 回调中访问全局数组
【发布时间】:2014-07-17 00:18:50
【问题描述】:

我正在尝试访问 $.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 回调中的全局变量。

【问题讨论】:

标签: javascript jquery ajax callback scope


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    当你这样做时:

    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 并尝试从 undefined 访问 .name 给你提到的类型错误。

    【讨论】:

      猜你喜欢
      • 2013-01-11
      • 2017-06-09
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      • 2017-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多