Странный рекурсивный бесконечный цикл, я не могу отследить - PullRequest
0 голосов
/ 29 марта 2010

У меня есть прототип с методом, с помощью которого я могу добавить обратные вызовы:

/*
 * 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;
    }
};

(Пожалуйста, проигнорируйте остальную часть для data_arg = true, поскольку это не имеет значения.)

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

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

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

Заранее спасибо!

1 Ответ

2 голосов
/ 29 марта 2010

Почему old_callback не определено с var?

var old_callback = this.data_callback;

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

...