所以我最近设置了一个chrome扩展来刷新页面并调用我写过的jsonp Web服务,但是存在内存泄漏。我搜索了所有的互联网以找到解决方案,似乎没有任何工作。我使用了简单的jQuery .ajax()调用指定“jsonp”,我使用了http://code.google.com/p/jquery-jsonp/中的jquery-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 :(得分: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
函数本身的整个上下文(包括returned
,textStatus
和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;
})();