Переменная область JavaScript - PullRequest
3 голосов
/ 22 декабря 2010

Я объявил 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 ]

4 голосов
/ 22 декабря 2010

success обратный вызов Ext.Ajax.request вызывается после того, как 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 callback вызывается. Поскольку локальной переменной нет var1, создается глобальная переменная и ей присваивается значение a (см. Комментарии ниже, почему это удаляется). Локальная переменная var1 по-прежнему доступна в области обратного вызова, но после завершения обратного вызова переменная больше нигде не доступна, поэтому ее нельзя использовать.

Помните, что «A» в AJAX означает «асинхронный».

4 голосов
/ 22 декабря 2010

Я предлагаю вам явно указать область действия в вашем коде.Вы можете сделать как:

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

Надеюсь, что это работает!

...