簡體   English   中英

如何重構這個Javascript匿名函數?

[英]How to refactor this Javascript anonymous function?

我們的代碼中有這個匿名函數,它是jQuery的Ajax對象參數的一部分,它使用調用它的函數中的一些變量。

this.invoke = function(method, data, callback, error, bare) {
      $.ajax({
        success: function(res) {
            if (!callback) return;

            var result = "";
            if (res != null && res.length != 0)
                var result = JSON2.parse(res);

            if (bare)
            { callback(result); return; }

            for (var property in result) {
                callback(result[property]);
                break;
            }
        }
   });
}

我省略了額外的代碼,但你明白了。 代碼工作得很好,但它在IE中每次調用時泄漏4 Kbs,所以我想重構它以將匿名函數轉換為命名函數,如this.onSuccess = function(res){..}。

問題是這個函數使用了this.invoke(..)中的變量,所以我不能把它帶到它的體外。 如何正確重構此代碼,以便它使用匿名函數和父函數變量?

更新。 我正在考慮創建一個單獨的對象,使用相同的參數初始化它,並將其onSuccess函數作為jQuery的Ajax對象的參數傳遞。 雖然我懷疑它仍會泄漏內存。

更新2.我發現一些鏈接表明實際的泄漏可能是由jQuery引起的。 簡單的jQuery Ajax調用泄漏Internet Explorer中的 內存泄漏涉及jQuery Ajax請求

找到一種重構方法仍然很好。

更新3.在接受答案之前,我將等待更通用的解決方案。

您可以在可以在成功回調中訪問的ajax請求中添加額外的參數:

this.invoke = function(method, data, callback, error, bare) {
    $.ajax({
        success: onSuccess,
        invokedata: {
         callback: callback,
         bare: bare
        }
    });
};

var onSuccess = function(res) {
    var callback = this.invokedata.callback,
        bare = this.invokedata.bare;
    if (!callback) return;

    var result = "";
    if (res != null && res.length != 0)
        var result = JSON2.parse(res);

    if (bare){
        callback(result); 
        return;
    }

    for (var property in result) {
        callback(result[property]);
        break;
    }
}

優秀,優秀的問題+1 - 我感覺到你的痛苦 - 這是非常好的因素。

一個建議(也許這就是你更新的意思)...為onSuccess定義一個包裝器並讓它返回你想要分配的函數。 然后調用外部函數並將其分配給“success”選項,傳遞它需要的值。 這些值將預先分配給內部函數中的變量。 實際上並不確定這是否會有所幫助 - 你仍然會得到一個匿名函數 - 但值得一試

this.invoke = function(method, data, callback, error, bare) {
    $.ajax({
        success: onSuccess(callback, bare);
    });
};

var onSuccess = function(callback, bare) {
     return function() {
        if (!callback) return;

        var result = "";
        if (res != null && res.length != 0)
            var result = JSON2.parse(res);

        if (bare)
        { callback(result); return; }

        for (var property in result) {
            callback(result[property]);
            break;
        }
     }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM