JavaScript变量范围

JavaScript变量范围,javascript,extjs,closures,scope,Javascript,Extjs,Closures,Scope,我在函数中声明了var1。然而,当我尝试在内部函数2中赋值时,似乎另一个var1是create,而不是引用第一个var1 var func1 = function(response) { var var1; function inner_function2(param) { Ext.Ajax.request({ url:'', params: param, success:functio

我在函数中声明了var1。然而,当我尝试在内部函数2中赋值时,似乎另一个var1是create,而不是引用第一个var1

var func1 = function(response) {

    var var1;

    function inner_function2(param) {

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

}()

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

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;
      }
    });
  }
}()

希望它能起作用

success
在返回Ajax请求后调用
Ext.Ajax.request
的回调。这意味着调用它的函数(包括
func1()
internal\u function2()
都已返回,其作用域已被删除

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

  • 调用
    func1()
  • 局部变量
    var1
    已声明
  • internal\u function2()
    被调用(我假设您确实在某处调用了它)
  • 调用
    Ext.Ajax.request()
    ,并声明
    success
    回调
  • 内部函数2()
    结束-AJAX请求正在后台运行
  • func1()
    结束,局部变量
    var1
    被删除(尽管它仍在回调范围内可用)-AJAX请求在后台运行
  • AJAX请求完成-
    success
    调用回调。由于没有局部变量
    var1
    将创建一个全局变量,并将其赋值为
    a
    (请参见下面的注释,说明删除此变量的原因).Local变量
    var1
    在回调的作用域中仍然可用,但一旦回调结束,该变量在任何地方都不再可用,因此您无法使用它

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

    如果复制+粘贴出现问题,我认为语法无效?另外,您如何确定“似乎创建了另一个var”?这是ExtJS特有的吗?如果是的话,我会感到惊讶,因为通常闭包会覆盖这一点。是的,
    success
    回调在
    internal_function2
    返回很久之后才被调用,但是闭包应该在回调中保持
    var1
    活动。@deceze:如果赋值是
    a=var1
    那么是。但是因为它是另一种方式,所以它不是。得了吧。如果这个变量在任何地方都不再可用,你会如何使用它?@CKeven:因为异步调用就是这样工作的。func1()不会等待AJAX请求完成。它只是启动它,然后继续它的工作。胡说,封闭变量是封闭变量,无论它位于赋值的哪一侧。我同意,真正的问题是变量没有在正确的范围/时间内访问,但赋值确实分配给
    var var1。解决方案是在func1函数声明之外创建var1(或者跳过
    var var1
    中的var,然后全局创建它,但这不是一个很好或可读的解决方案)。