0

クロージャ内で呼び出している配列のセットがあり、utilsという別のファイルで宣言されています。

utils.js

var array1 = [];
var array2 = [];
var array3 = [];
var array4 = [];

My Closures.js

(function() {

myObject.createWindow= function() {
     someField.value = array1;
})();
  1. 他のファイルにあるarray1オブジェクトをクロージャである別のjsファイルに参照している場合、メモリリークが発生しますか?
4

4 に答える 4

4

配列がファイルのルートにある場合、それはグローバル変数です。

確かにメモリが必要ですが、このメモリが増える特別な理由はありません。

したがって、ここではメモリリークの特定のリスクはありません。

于 2013-02-08T18:45:18.897 に答える
2

割り当てられたメモリは、アクセスする方法がなくなったときにガベージコレクションされます。したがって、配列がまだ呼び出すことができるクロージャで参照されている場合、ガベージコレクションは行われません。

例えば:

f = function() {
    var arr1 = [];
    var arr2 = [];

    return function() {
        return arr1;
    }
};

v = f();

arr2はすぐにガベージコレクションできますが、arr1には引き続きアクセスできるため、vの値が別の値に変更されるまでarr1は収集できません。

だから、あなたの場合、あなたは

var arr1 = [];
var arr2 = [];

...

f = function() {
    return arr1;
}

したがって、arr2はガベージコレクションできますが(スコープ外になり、他の場所で参照されていない場合)、arr1はガベージコレクションがなくなるまで収集できません。具体的には、あなたの場合、createWindowはarray1を参照しているため、ガベージコレクションを行うことはできません。

しかし、別の投稿で指摘されているように、両方がグローバルスコープを持っている場合は、どこからでも参照できるため、どちらもグローバルスコープにはなりません。

于 2013-02-08T18:53:18.477 に答える
2

メモリーが解放されるべきときに解放されない場合、メモリーはリークされたと見なされます。配列をグローバル名前空間にアタッチすると、グローバル名前空間が解放されたときに解放されます。言い換えれば、彼らがリークするのは、ブラウザの障害が原因であると考えられます。ページがスコープを失うまで、それらはほとんど収集されません。ページがコードで導入できるスコープを失った後、それらに影響を与える可能性のあるものは何もありません。

配列をガベージコレクションする場合は、ある時点でスコープを失うスコープに配列を配置します。スコープがスコープを失うと、アレイはガベージコレクションの対象になります(ただし、すぐにガベージコレクションは行われません)。

于 2013-02-08T19:07:56.860 に答える
-2

ファイル->オブジェクトの解決とガベージコレクション(javascriptが一般的にメモリを管理する方法)が互いに関連しているとしたら、それは非常に驚くべきことです。メモリリークが発生することはありません。

于 2013-02-08T18:45:46.383 に答える