0

所以我最近設置了一個chrome擴展來刷新頁面並調用我寫的jsonp web服務,但是有一個內存泄漏。我搜索了所有的互聯網尋找解決方案,似乎沒有任何工作。我使用了簡單的jQuery .ajax()調用,指定了「jsonp」,我使用了在http://code.google.com/p/jquery-jsonp/找到的jquery-jsonp,以及其他一些方法......我無法讓內存泄漏消失。有人可以指點我的例子嗎?我正在尋找什麼,或者指向正確的方向?我只需要看到一個腳本不斷調用jsonp調用而不會泄漏內存。jsonp內存泄漏

運行我的代碼時,有沒有泄露,直到我到達這個代碼:

$.jsonp({ 
       url: serviceUrl + "/AddPick?callback=?&" + jQuery.param(json), 
       success: function (returned, textStatus) { 
        callback({ "d": returned.d, "pickCount": pickCount }); 
       } 
      }); 

,如果我替換代碼:callback({ "d": "1", "pickCount": pickCount }); 然後泄漏消失。

+0

你能發佈你的代碼嗎?或者至少你在做什麼代碼明智的總體佈局?另外,JavaScript端還是服務器端的內存泄漏?刪除不相關的標籤。 – strager 2010-08-12 04:59:18

+0

可能重複的[jsonp內存泄漏](http://stackoverflow.com/questions/3464766/jsonp-memory-leak) – 2010-08-12 05:01:16

+0

@Justin Niessner,@joelatdotzilla要求刪除其他問題,並使用這一個代替。 – strager 2010-08-12 05:01:57

回答

2

如果你的代碼的結構是這樣的:

function callback() { 
    // (or similar, maybe with `setTimeout`) 

    $.jsonp({ 
    url: serviceUrl + "/AddPick?callback=?&" + jQuery.param(json), 
    success: function (returned, textStatus) { 
     callback({ "d": returned.d, "pickCount": pickCount }); 
    } 
    }); 
} 

然後正在創建遞歸success功能。調用堆棧可能看起來像這樣:

> callback 
    > $.jsonp 
    > NEW success 
     > callback 
     > $.jsonp 
      > NEW success 
      > ... 

日益棧,在每次迭代時被創建的新success功能,並且的success函數本身的整個範圍內(包括returnedtextStatus,和callback的上下文)最終會導致運行時必須記錄但基本上未使用的對象。

另一種方法是有callback範圍之外的輔助功能:

function callCallback(returned, textStatus) { 
    callback({ "d": returned.d, "pickCount": pickCount }); 
} 

function callback() { 
    // (or similar, maybe with `setTimeout`) 

    $.jsonp({ 
    url: serviceUrl + "/AddPick?callback=?&" + jQuery.param(json), 
    success: callCallback 
    }); 
} 

如果需要,使功能專用。例如:

var callback = (function() { 
    function callCallback(returned, textStatus) { 
    callback({ "d": returned.d, "pickCount": pickCount }); 
    } 

    function callback() { 
    // (or similar, maybe with `setTimeout`) 

    $.jsonp({ 
     url: serviceUrl + "/AddPick?callback=?&" + jQuery.param(json), 
     success: callCallback 
    }); 
    } 

    return callback; 
})();