0

我有一组数组,我在我的闭包中调用它们,它们在另一个名为 utils 的文件中声明。

实用程序.js

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

我的 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 回答