首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Javascript中需要有关变量作用域的帮助

在Javascript中需要有关变量作用域的帮助
EN

Stack Overflow用户
提问于 2010-08-17 18:43:28
回答 3查看 187关注 0票数 7

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

代码语言:javascript
运行
复制
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数组,可能是全局数组)。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-17 18:47:21

这真的不是范围问题,而是$.getJSON()是异步的,这意味着这部分会在你返回后运行:

代码语言:javascript
运行
复制
for (var i in response) {
  groups.push(response[i]);
}

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

代码语言:javascript
运行
复制
$.getJSON('get_groups.php', function(response) {
    var groups = [];
    for (var i in response) {
        groups.push(response[i]);
    }
    doSomethingThatNeedsGroups(groups);
});

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

票数 5
EN

Stack Overflow用户

发布于 2010-08-17 18:46:27

除非您真的有一个名为groups的全局变量(实际上这不是最好的想法),否则您就是在与您的“局部”groups变量对话。

由于EMCA-/Javascript确实具有函数作用域,并且您在那里使用的是闭包,因此您确实可以访问该变量。所以这里的问题不在于作用域。,,所以即使有一个具有完全相同名称的全局变量,所谓的词法作用域也会保证你可以访问你的局部变量。,

实际问题是,return groups$.getJSON()完成之前就执行了。因为它创建了一个ajax请求,所以它是异步运行的。

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

代码语言:javascript
运行
复制
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
});
票数 1
EN

Stack Overflow用户

发布于 2010-08-17 18:49:20

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

groups-Array中的更改会在回调和返回groups之后生效。

"get_groups"

  • trigger callback

  • anynomous

  • get_groups end

  • 请求url并注册callback

  • return groups

  • end of“get_groups”

  • trigger callback

  • anynomous callback-function groups of anynomous

您不能直接返回回调函数的修改。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3501547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档