0

だから私は最近、ページを更新し、私が書いた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関数自体のコンテキスト全体 ( 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;
})();
于 2010-08-12T17:16:47.830 に答える