jsonp内存泄漏

时间:2010-08-12 04:57:55

标签: javascript jquery jsonp webservice-client webservices-client

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

1 个答案:

答案 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函数本身的整个上下文(包括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;
})();