2

Javascriptクライアント側アプリケーション。

メモリリークを排除しようとすると、(控えめに言っても)醜いコードになります。

それらを回避しようとしてすべてのコードを台無しにする代わりに、window.unloadでクリーンアップしようとしています。

私たちは主にelement.onevent=function(){..};パターンを使用します。その結果、クロージャ(主に必要)とメモリリークが発生します。

javascriptフレームワークは使用しません。

出口で適切にクリーンアップする方法について何かアイデアはありますか?

誰かが同じことをしますか、それともあなたはそれらを避けようとしていますか?

4

4 に答える 4

2

最善の解決策は、イベント処理を管理する独自のメソッドを展開することです。したがって、イベント ハンドラーをアタッチすると、メソッドは追加されたすべてのイベントを追跡できます。アンロード時に、すべてのハンドラーを登録解除できます。

ライブラリを使用しないと言ったのは知っていますが、それらのコードをインスピレーションとして使用できます。Ext.EventMgr.addListener を使用すると、Ext-js がそれを行います。

開始するために使用できる単純な EvtMgr obj を次に示します。非常に単純なので、ここにすべてを書ききることはできません。やりたいことやわからないことなど、気軽に質問してください。また、追加できるハンドラーは 1 つだけなので、element.onclick メソッドは使用しないことに注意してください。あなたがそう言ったから、私はそのようにしています。

var EvtMgr = (function(){
  var listenerMap = {};

  // Public interface
  return {
    addListener: function (evtName, node, handler) {
      node["on" + evtName] = handler;
      var eventList = listenerMap[evtName];
      if (!eventList) {
        eventList = listenerMap[evtName] = [];
      }
      eventList.push(node);
    },

    removeAllListeners: function() {
      for (var evtName in listenerMap) {
        var nodeList = listenerMap[evtName];
        for (var i=0, node; node = nodeList[i]; i++) {
          node["on" + evtName] = null;
        }
      }
    }
  }
})();

また、クロージャーを持つハンドラーがリークを作成する唯一の方法ではないことに注意してください。この質問に対する私のコメントを参照してくださいWeb ページのアンロード後に Javascript メモリ リークが発生する

また、一部の人々が図書館を恐れている理由がわかりません。jquery は非常に小さく、ext コアも同様です。js を理解していない状態で使用すると危険です。しかし、js のスキルがしっかりしている場合は、コードを再利用することで多くの作業を節約できます。何かがどのように行われるかを理解する必要があるとき、私は毎日 ext-js の内部に入ります。これが、これらの数行のコードを提供した方法です。

メモリ リークを管理するときに考慮すべきもう 1 つの考えは、DOM から要素を削除するとき (node.innerHTML またはその他の方法) にハンドラーを削除することです。その場合、DOM から削除したノードからハンドラを削除する必要があります。それを機能させるにはいくつかの作業がありますが、それはあなたの戦略の一部であるべきです.

于 2009-12-11T17:25:22.487 に答える
1

イベントによるメモリリークを回避するためのソリューションは、委任です。簡単に言うと、イベントハンドラーを子ではなく親オブジェクトにアタッチします。伝播のため、子のクリックは親のクリックとしても登録され、ハンドラーがトリガーされます。イベントのターゲット属性を確認することで、それをどうするかを決めることができます。

ハンドラーは親にアタッチされているため、リークを気にせずに子を追加または削除できます。

より詳細な説明はここにあります:http ://www.robertnyman.com/2008/05/04/event-delegation-with-javascript/

ここでのデモ:http ://www.robertnyman.com/test/event-delegation/event-delegation.html

于 2008-12-04T09:18:00.970 に答える
0

これに関する私の調査のほとんどから、これを行うための良い方法はありません。個々のブラウザには、ガベージコレクションの独自の実装があります。

Firefoxはそれほど悪くはありませんが、たとえばIE6はひどいものです。60を超えるオブジェクトを作成してみると、IE6は非常に遅くなります。

それらの1つに過ぎませんが、私は受け入れるようになりました。

于 2008-12-04T09:14:16.720 に答える
0

JavaScriptには自動メモリ管理があるため、クリーンアップの意味がわかりません。しかし、とにかく、私が理解しているように、ウィンドウがアンロードされた後、JSに関連付けられているすべてのメモリも解放されます。結局のところ、ページがアンロードされた後、ページから実行されているJSはもうありませんよね?

于 2008-12-04T08:54:42.907 に答える