0

コールバックを追加できるメソッドを持つプロトタイプがあります。

/*
 * 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のelse部分は関係がないため、無視してください。)

具体的なケースでは、3つのコールバック関数を追加しています。ただし、this.data_callback()が最終的に要素に対して呼び出されると、全体が無限にループします。バグを追跡するための私の試みでは、上記のアラート(ええ、そのためのデバッグツールがあることは知っていますが、そのようにはるかに快適でした)は、問題について次の洞察を提供しました。

  1. 匿名関数/クロージャ(jQuery.extend()を含むもの)が呼び出されます。new_callbackには、3番目のコールバック関数が含まれています。old_callbackには別の...が含まれています
  2. 呼び出される無名関数。new_callbackには、2番目のコールバック関数が含まれています。old_callbackには最初のコールバック関数が含まれている必要がありますが、実際にはさらに別の関数です...
  3. 呼び出される匿名のコールバック。new_callbackには、2番目のコールバック関数が再び含まれています。old_callbackには無名関数が含まれています
  4. ..。

さて、私は何が恋しいですか?それは奇妙な閉鎖魔法なのか、それとも私が明らかに見ることができない明らかなバグなのか?

前もって感謝します!

4

1 に答える 1

2

old_callbackで定義されていないのはなぜvarですか?

var old_callback = this.data_callback;

そのままでは、グローバル変数です。多分それは他の場所で宣言されていますが、それでも私には疑わしいようです。

于 2010-03-29T13:46:23.797 に答える