2010-11-18 2 views
0

У меня проблема. Я пытался решить проблему того, как избежать использования глобальных переменных. Я решил использовать объект с функциями на нем вместо этого, и написал сценарий соответственно. Тем не менее, сценарий не будет работать, как ожидалось:Доступ к переменной, значение которой задано в функции AJAX

GetXML: function() { 
     $.ajax({ 
      type: "GET", 
      url: "questions.xml", 
      dataType: "xml", 
      success: function(xml) { 
       this.xml=xml; 
       $(window).trigger("canUseXML"); 
       var docLength = $(xml).find('Question').length + 1; 
       alert("this really is an '" + this.xml + "' and the actual doclength is: " + docLength)//This is the first alert I mention.   
      } //close success   
     });//close AJAX  

     alert("yes! this is still a: " +this.xml) //This is the second alert I mention. 
    }, 

Если все это бежало, как и ожидалось, оба предупреждения приведет к «объекта XMLDocument» (переменная объявлена ​​в другом месте в этой строке: this.xml = null;). Первый работает так, как ожидалось. Однако второй, вне этой функции, возвращает значение «null». Зачем?

Спасибо, Эллиот Bonneville

P.S. Я застрял на кажущемся простым вопросом о передаче переменных между функциями в течение недели.

+2

Просьба отметить это любым языком, на котором вы используете –

+1

Какой язык? Вы должны поместить его в теги, чтобы они поняли. – Dima

+0

О, ну, извините. –

ответ

2

В JavaScript «это» всегда относится к «владельцу» выполняемой функции или, вернее, к объекту, в котором функция является методом. Итак, ваше первое и второе «это» не относится к одному и тому же.

Предполагая, что функция «успеха» выполняется перед вторым предупреждением (чего, вероятно, нет). Вы могли бы сделать что-то вроде этого:

GetXML: function() { 
var that=this; 
. 
. 

, а затем использовать «это» вместо «этого».

+0

Когда я объявляю «это», я получаю «missing: after property id» в Firebug, и мои предупреждения не работают. Почему это происходит? –

+0

Все еще никто не знает? –

0

Это, вероятно, происходит потому, что ajax требует времени для обработки. Javascript не ждет одного запроса перед выполнением следующей команды, поэтому, пока AJAX вызывается, он пытается выяснить, что случилось с this.xml.

+0

Если вы собираетесь голосовать, ответьте, пожалуйста, укажите причину. –

1

Оценка области. Как только вы выходите за пределы анонимной функции (xml), этот.xml больше не существует.

+0

Нет, потому что, как я сказал ранее, эта переменная объявлена ​​ранее в коде. Задачи обзора - это то, что этот объект и его методы предназначены для предотвращения. –

+0

Да и нет: 'this.xml' существует, но' this' внутри анонимной функции отличается от 'this' вне нее. – Residuum

+0

Не имеет значения, заявите ли вы это раньше. это внутри функции, и это вне функции различно. – m4tt1mus

1

У вас есть две проблемы:

  1. Scoping: this внутри обратного вызова не ваш объект с GetXML в качестве члена. Используйте что-то вроде me = this; в конструкторе вашего объекта, а затем используйте me вместо this, чтобы явно установить значение.

  2. Функция обратного вызова ожидает успеха вашего запроса Ajax, но остальная часть скрипта продолжается, что является целью обратных вызовов. Таким образом, выполняется запрос Ajax, а затем вы делаете alert("yes! this is still a: " +this.xml), а обратный вызов еще не выполнен.

+0

А ... Это имеет смысл. –

Смежные вопросы