gpt4 book ai didi

javascript - jsonp内存泄漏

转载 作者:行者123 更新时间:2023-12-02 20:34:59 24 4
gpt4 key购买 nike

所以我最近设置了一个 chrome 扩展来刷新页面并调用我编写的 jsonp Web 服务,但存在内存泄漏。我搜索了整个互联网以寻找解决方案,但似乎没有任何效果。我使用了指定“jsonp”的普通 jQuery .ajax() 调用,我使用了在 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 });然后泄漏就会消失。

最佳答案

如果您的代码结构如下:

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 函数本身的整个上下文(其中包括返回) >、textStatuscallback 的上下文)最终会生成运行时必须跟踪但基本上未使用的对象。

另一种方法是在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
});
}

如果需要,请将函数设为私有(private)。例如:

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;
})();

关于javascript - jsonp内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3464858/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com