JavaScript变量范围

时间:2010-12-22 06:15:25

标签: javascript extjs closures scope

我在函数中声明了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;
                }
            });
    }   

}()

2 个答案:

答案 0 :(得分:4)

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

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

希望它有效!

答案 1 :(得分:4)

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

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

  1. func1()被称为
  2. 声明了局部变量var1
  3. inner_function2()被调用(我假设你在某处调用它)
  4. 调用
  5. Ext.Ajax.request(),声明success回调
  6. inner_function2()结束 - AJAX请求在后台运行
  7. func1()结束时,局部变量var1被删除(它仍然是在回调范围可用虽然) - AJAX请求是在后台运行
  8. AJAX请求完成 - 调用success回调。 由于没有局部变量var1,创建一个全局变量和分配的值a (见下文这是为什么删除的注释)。局部变量var1仍然可以在回调的范围,但一旦回调结束时,变量不再可用在任何地方,所以你不能使用它。
  9. 请记住,AJAX中的'A'代表'异步'。