ビューを更新角度のJsでかなり標準的な方法、この例を考える:このAJAXパターンはメモリリークですか?
$scope.fetchResults = function() {
// Some local variable that will cause creation of closure
var hugeData = serviceX.getMilionRecords();
// Any call to any resource with success and error handlers.
$http({
method: "GET",
url: "/rest-api/bulk-operation-x",
params: { someParam: hugeData.length }
}).success(function() {
var length = hugeData.length;
$scope.reportToUser("Success, that was " + length + " records being processed!";
}).error(function() {
var length = hugeData.length;
$scope.reportToUser("Something went wrong while processing " + length + " records... :-(";
});
};
これはもちろん仮定の例であるが、それはうまく内からローカル変数の再利用として説明することができるパターンを示しますAJAXコールバック。両方のハンドラ(success
とerror
)におけるもちろん
我々は直接コールバックハンドラから参照されるhugeData
上クロージャを作成しています。
私の質問です:AJAX呼び出しの結果は成功または失敗のいずれかのみになる可能性があるため、このコードを再利用するとメモリリークが発生しますか?私は "はい"と答えるだろうが、私は地元のテストでこれを確実に証明することができなかった。
もう少し経験豊かな教師が私にこのことを説明したいと思います。毎日Angularで作業している人からの返信が大好きですが、jqueryの返信も歓迎します。
「メモリリーク」は、割り当てられているメモリを参照し、その後解放されないことを指す非常に特殊な用語です。これは、メモリ管理が手動で行われるコンテキストにのみ適用されます。 JS管理ではプログラマーに透過的であることを考えると、メモリリークは、IEの古いバージョンの場合のように、バグのある実装で特定の状況下でメモリがリークする原因となるコーディングパターンについてのみ関連します。質問が書かれているように意味があるのかどうか分かりません。 – Jon
@ Jonのコメントに同意しない。悪い習慣は、グローバルスコープ内のオブジェクトを埋めるようなメモリリークを引き起こす可能性があります。このケースでは、コールバックのいずれかが終了するとhugeデータ変数が削除され($ httpインスタンスがクリーンアップされると最大) – rewritten
@Jon、あなたは非常に簡単に透過的なメモリ管理と任意の言語でメモリリークを作成することができます。 Java、Scala、JavaScript、C#、あなたはその名前を付けます。 @rewritten、これはまさに私が話していることです。 'success()'が終了したときに 'hugeData'が削除されたことをどのように知っていますか?言語の観点からは、 'error()'で使われたクロージャは、後である程度後で実行されるかもしれません。フードの下でAngularが何かをしない限り(終了時に他のコールバックを無効にするなど)、ここでメモリリークが発生する可能性があります。 –