0

所以我最近设置了一个 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 }); 那么泄漏就会消失。

4

1 回答 1

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(包括returnedtextStatuscallback的上下文)最终导致运行时必须跟踪但基本上未使用的对象。

另一种方法是在 的范围之外有一个辅助函数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;
})();
于 2010-08-12T17:16:47.830 回答