在闭包之外引用数组会导致内存泄漏吗?

时间:2013-02-08 18:43:55

标签: javascript closures

我有一组数组,我在我的闭包中调用,这些数组在另一个名为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 个答案:

答案 0 :(得分:4)

如果您的数组位于文件的根目录下,则它是一个全局变量。

确实需要记忆,但这种记忆没有特定的原因可以增长。

所以这里没有特定的内存泄漏风险。

答案 1 :(得分: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,因此绝对不能进行垃圾回收。

但正如另一篇文章所指出的那样,如果它们都具有全球范围,那么两者都不会,因为它们仍然可以在任何地方被引用。

答案 2 :(得分:2)

当应用程序未被释放时,内存被认为是泄露的。将数组附加到全局名称空间意味着它们将在全局名称空间发布时释放。换句话说,对于他们泄漏,这将是因为浏览器失败。在页面失去范围之前,它们几乎永远不会被收集。在页面失去可以在代码中引入的范围之后,没有什么可以影响它们。

如果您希望对阵列进行垃圾回收,请将它们放在范围内,以便在某些时候丢失范围。当范围失去其范围时,数组将符合条件进行垃圾收集(但不会立即收集垃圾)。

答案 3 :(得分:-2)

如果file->对象解析和垃圾收集(javascript管理内存的方式)完全相互关联,那将是非常令人惊讶的。它不应该导致内存泄漏。