在Javascript中需要有关变量范围的帮助

时间:2010-08-17 10:43:28

标签: javascript jquery scope getjson

我有以下Javascript函数,它应该返回数据库中的一组数组。它使用$.getJSON()方法调用实际从数据库中读取的get_groups.php

function get_groups() {
    var groups = [];

    $.getJSON('get_groups.php', function(response) {
        for (var i in response) {
            groups.push(response[i]);
        }
    }

    return groups;
}

不幸的是,这个函数没有按预期工作,因为groups.push(response[i]); 没有填充var groups = [];(据我所知它填充了一些其他groups数组,可能是全局数组。) p>

假设我不想拥有全局groups变量,您将如何解决此问题?

3 个答案:

答案 0 :(得分:5)

这不是范围问题,事实上$.getJSON()是异步的,这意味着此部分在之后运行

for (var i in response) {
  groups.push(response[i]);
}

您需要在异步请求的回调中调用任何函数需要此数据,因此它在数据可用时运行,如下所示:

$.getJSON('get_groups.php', function(response) {
    var groups = [];
    for (var i in response) {
        groups.push(response[i]);
    }
    doSomethingThatNeedsGroups(groups);
});

目前,您的群组 正在填充,而不是在您需要时。如果你绝对来返回它(我强烈建议按照预期的方式使用异步模型),你可以使用完整的$.ajax()版本并设置async:false。再说一遍......如果可能的话,不要走那条路,坚持调用任何需要数据的函数,因为async: false会锁定用户的浏览器。

答案 1 :(得分:1)

除非你真的有一个名为groups的全局变量(实际上这不是最好的主意),否则你正在与你的“本地”groups变量进行对话。

由于EMCA- / Javascript确实具有功能范围,并且您在那里使用闭包,因此您可以访问该变量。所以这里的问题,不是范围。 因此,即使使用具有完全相同名称的全局变量,这样的被称为词法范围也将保证您可以访问本地变量。

确实问题是return groups$.getJSON()完成之前执行。由于它创建了一个ajax请求,因此它运行asynch。

您应该自己使用callback来处理数据:

function get_groups(cb) {
   var groups = [];

   $.getJSON('get_groups.php', function(response) {
       for (var i in response) {
           groups.push(response[i]);
       }
       cb.apply(null, [groups]);
   }
}

get_groups(function(groups){
   // do something with groups array
});

答案 2 :(得分:0)

“$。getJSON('get_groups.php',function(response){”是一个回调函数。

在回调被trickerd之后以及返回组之后,groups-Array中的更改会受到影响。

  1. get_groups enterd
  2. 请求网址并注册回调
  3. 返回群组
  4. “get_groups”的结尾
  5. 触发回拨
  6. anynomous callback-function enterd
  7. modifie groups-array
  8. 任意回调函数的结尾
  9. 你无法直接返回回调函数的修改。