【问题标题】:JavaScript variable scopeJavaScript 变量范围
【发布时间】:2025-11-29 18:10:01
【问题描述】:

我已经在函数内部声明了 var1。但是,当我尝试在 inner_function2 中分配一个值时,似乎创建了另一个 var1 而不是引用第一个。

var func1 = function(response) {

    var var1;

    function inner_function2(param) {

        Ext.Ajax.request({
            url:'',
            params: param,
            success:function(result, request) { 
                var1 = a;
                }
            });
    }   

}()

【问题讨论】:

  • 如果复制+粘贴问题,我想语法无效?另外,您如何确定“似乎创建了另一个 var”?

标签: javascript extjs closures scope


【解决方案1】:

我建议您在代码中明确指定范围。你可以这样做:

var func1 = function(response) {
  var var1;
  var outer_scope = this;

  function inner_func2(param) {
    Ext.Ajax.request({
      url: '',
      params: param,
      scope: outer_scope,
      success: function(result, request) {
        var1 = a;
      }
    });
  }
}()

希望它有效!

【讨论】:

    【解决方案2】:

    Ext.Ajax.requestsuccess 回调在 AJAX 请求返回后被调用。这意味着,调用它的函数(func1()inner_function2() 都已经返回,并且它们的作用域已被删除。

    让我们尝试展示一系列事件

    1. func1() 被调用
    2. 声明了局部变量var1
    3. inner_function2() 被调用(我假设你在某处调用它)
    4. Ext.Ajax.request() 被调用,并声明了 success 回调
    5. inner_function2() 结束 - AJAX 请求正在后台运行
    6. func1() 结束,局部变量 var1 被删除(它仍然在回调范围内可用)- AJAX 请求在后台运行
    7. AJAX 请求完成 - 调用 success 回调。 由于没有局部变量var1,所以创建了一个全局变量并赋值为a(请参阅下面的 cmets 删除它的原因)。局部变量var1在回调的范围内仍然可用,但是一旦回调结束,该变量在任何地方都不再可用,所以你不能使用它。

    请记住,AJAX 中的“A”代表“异步”。

    【讨论】:

    • 这是 ExtJS 特有的吗?如果是这样,我会感到惊讶,因为通常这会被闭包所覆盖。是的,success 回调在 inner_function2 返回很久之后才被调用,但闭包应该让 var1 在回调中保持活动状态。
    • @deceze:如果分配的是a = var1,那么是的。但由于它是相反的方式,它不是。快点。如果它在任何地方都不再可用,你将如何使用这个变量?
    • @CKeven:因为这就是异步调用的工作方式。 func1() 不会等待 AJAX 请求完成。它只是启动它,然后继续它的工作。
    • 废话,闭包变量是闭包变量,无论它位于赋值的哪一侧。我同意真正的问题是没有在正确的范围/正确的时间访问变量,但是赋值确实分配给var var1
    • 解决方案是在 func1 函数声明之外创建 var1(或者跳过 var var1 中的 var,然后全局创建,但这不是一个很好或可读的解决方案)。跨度>