【问题标题】:Need help with variable scope in Javascript在 Javascript 中需要变量范围的帮助
【发布时间】:2010-08-17 19:03:07
【问题描述】:

我有以下 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 数组,可能是全局数组)。

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

【问题讨论】:

    标签: javascript jquery scope getjson


    【解决方案1】:

    这真的不是范围问题,而是$.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);
    });
    

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

    【讨论】:

      【解决方案2】:

      除非您确实有一个名为 groups 的全局变量(实际上这不是最好的主意),否则您正在与您的“本地”groups 变量交谈。

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

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

      您应该自己使用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
      });
      

      【讨论】:

      • 移动return语句不起作用,该函数将什么也不返回。
      • 在您发送之前已修复:p
      • 对于您的编辑,您可以使用.call(null, groups) 进行更简洁的操作,但您的答案的第一部分有点偏离...如果有一个与您同名的更多局部变量重新总是使用那个变量,一个全局变量永远不会覆盖一个更局部范围的变量。
      • @Nick:是的,也许吧。我希望关于函数范围的第二部分能说清楚。
      【解决方案3】:

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

      groups-Array 中的更改在回调被欺骗之后以及在您返回组之后都会受到影响。

      1. get_groups 已输入
      2. 请求网址并注册回调
      3. 返回组
      4. “get_groups”结束
      5. 触发回调
      6. 输入了任意回调函数
      7. 修改组数组
      8. 任意回调函数结束

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

      【讨论】:

      • 仅供参考,同步 ajax 可以解决问题,但不推荐
      猜你喜欢
      • 1970-01-01
      • 2014-03-10
      • 1970-01-01
      • 2010-12-30
      • 2013-09-23
      • 1970-01-01
      • 2011-02-20
      • 2016-10-22
      • 2012-03-18
      相关资源
      最近更新 更多