0
4

1 に答える 1

2

ifの本体をこのコードに置き換えてみてください。

        aTags[i].addEventListener("mouseover", (function(source, fragment)
        {
            return function()
            {
                if (this.title == "")
                {
                    (providers[source])(this, fragment);
                }
            }
        })(data[1], data[2]), false) ; 

ループが完了した後に注意してください aTags = null;

問題は、if ステートメント ブロックが真のスコープではないことです。var'd はすべて、外側の関数スコープに属します。したがって、イベント ハンドラーとして提供する内部関数は、最後のパスのソース、リンク、およびフラグメントを使用します。さらに、DOM オブジェクトへの参照を維持すると、循環参照によるメモリ リークが発生します。

上記のアプローチは、関数呼び出しを介してパスごとに新しいスコープを作成するため、各ソースとフラグメントは独自のスコープ内にあります。また、イベント リスナーとして呼び出される関数thisには、それがアタッチされている要素を指すプロパティがあるという事実を利用して、DOM 要素を含む循環参照を回避します。

于 2009-01-09T11:26:03.690 に答える