2010-03-29 2 views
0

У меня есть прототип, имеющий метод, который я могу добавить обратные вызовы с: (. Игнорируйте еще часть для data_arg = верно, как это не имеет значения)Странно рекурсивный бесконечный цикл я не могу отследить

/* 
* Add a callback function that is invoked on every element submitted and must return a data object. 
* May be used as well for transmitting static data. 
* 
* The callback function is supposed to expect a jQuery element as single parameter 
* and must return a data object (for additional data to be sent along with the one already given upon initialization). 
* Adding multiple callback functions results in those functions being invoked in the same order as they were added. 
* 
* 1) Therefore subsequent assignments to the same key in the data array override those that were performed by a previous callback function. 
* 2) If data_arg = true is given, the data returned by the callback function that was previously called is given to the new_callback as 2nd argument, so it can be manipulated. 
* However, even if it isn't, the unchanged data must be returned anyway to have any effect. 
*/ 

this.add_data_callback = function(new_callback, data_arg) { 

    if(this.data_callback) { 
     old_callback = this.data_callback; 

     if(!data_arg) { 
      //alert('add it'); 
      //alert(old_callback); 
      //alert(new_callback); 

      this.data_callback = function(element) { 
       //alert('do it'); 
       //alert(old_callback); 
       //alert(new_callback); 
       return jQuery.extend(old_callback(element), new_callback(element)); 
      }; 
     } 
     else { 
      this.data_callback = function(element, data) { 
       return new_callback(element, old_callback(element)); 
      }; 
     } 
    } 
    else { 
     //alert('add the first'); 
     //alert(new_callback); 
     this.data_callback = new_callback; 
    } 
}; 

В моем конкретном случае я добавляю три функции обратного вызова. Однако, если this.data_callback(), наконец, вызывается для элемента, он приводит к бесконечной бесконечности цикла. В моей попытке отследить ошибку вниз, оповещения выше (да, я знаю, что вы отладочные инструменты для этого, но это был путь более комфортно, как это) передал следующее понимание вопроса:

  1. вызывается анонимная функция/закрытие (тот, который содержит jQuery.extend()). new_callback содержит третью функцию обратного вызова. old_callback содержит другое ...
  2. анонимная функция, которая называется. new_callback содержит вторую функцию обратного вызова. old_callback должен содержать 1-ю функцию обратного вызова, но на самом деле это еще один ...
  3. анонимный обратный вызов, который называется. new_callback снова содержит вторую функцию обратного вызова. old_callback содержит анонимную функцию
  4. ...

Теперь, что мне не хватает? Это какая-то странная магия закрытия или просто какая-то явная ошибка, которую я, видимо, не вижу?

Заранее благодарен!

ответ

2

Почему old_callback определяется как var?

var old_callback = this.data_callback; 

Как бы то ни было, это глобальная переменная. Может быть, это объявлено в другом месте, но оно все еще выглядит подозрительным для меня.

+0

Судя по использованию ключевого слова 'this', код отправляется как часть класса, а old_callback может быть частным свойством этого класса. –

+0

Awwwww. @ Энди: Это не так. – balu

+0

@codethief: продолжить дальше ;-) @Pointy: +1. –

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

  • Нет связанных вопросов^_^