2012-03-26 5 views
0

私はextjsの古いバージョンを使用してjsコードをデバッグしています。私は私のコードでは、この呼び出しを行います。問題は、()Ext.History.addを呼び出すと、IEのメモリリークを引き起こすことがあるどこからメモリリークが発生していますか?

Ext.History = (function() {/* code goes here. */ })(); 

Ext.History.add("text"); 

内部Ext.Historyは、次のように実装されています。​​

しかし、これはエラーの原因:だから は、私はおそらく、エンクロージャの使用を停止し、このような何かをしたいを前提としています。

編集:エラーは、ヒストリオブジェクト内のaddメソッドから発生しました。

+1

あなたが正しい軌道に乗っているとは思わない...(function(){/ * code goes here * /})(); 'は実際に関数を(1回)実行して結果を返すあなたの新しいコードとは異なります。リークがある場合は、add()メソッド内になければなりません。 – bhamlin

+0

@bhamlin私はあなたが正しいと思います。私は自分の質問に言い直すべきだった。 – Holtorf

答えて

1

メモリリークの証拠はありますか?ほとんどがIEで修正されていますが、それは数年前から注目されていませんでした。 IE 6と初期のIE 7では、DOMオブジェクトを含む循環参照に問題がありましたが、それらの古いバージョンでもかなり修正されています。以下でとにかく

、右に

> Ext.History = (function() {/* code goes here. */ })(); 

直ちに呼び出される関数式(生命維持に)のみ(glbalコードであると思われる)外側の範囲にクロージャを有しています。問題のあるクロージャがどこにあるかは表示されないので、コメントすることは非常に難しいです。

おそらくIIFEは、のaddプロパティを持つオブジェクトを返します。その関数はIIFEで宣言された変数とのクロージャを持っています。

Ext.History = (function() { 
    var foo = 'foo'; 
    return { 
    add: function(bar) { 
     return foo + ' ' + bar; 
    } 
    } 
})(); 

オブジェクト全体をオブジェクトに置き換えることができます。 歴史ではなく、閉鎖の以下はそれ以外は上記と同じように見えるだろうアクセスプロパティ:のこの値はを追加こと

Ext.History = { 

    foo: 'foo', 

    add: function (bar) { 
    return this.foo + ' ' + bar; 
    } 
}; 

注(例えばそれを呼び出す歴史でなければなりませんExt.History.add())それ以外の場合は動作しません。また、現在のプロパティと同じ名前の変数には新しい名前を付ける必要があります。

コード全体(またはパターンを示す妥当なチャンク)を投稿すると、修正が可能かもしれません。あるいは、新しいバージョンを見て、それを修正するために何をしたのかを見てください。

関連する問題