Javascript 引用闭包外部的数组是否会导致内存泄漏?

Javascript 引用闭包外部的数组是否会导致内存泄漏?,javascript,closures,Javascript,Closures,我在闭包中调用了一组数组,它们在另一个名为utils的文件中声明 utils.js var array1 = []; var array2 = []; var array3 = []; var array4 = []; My Closures.js (function() { myObject.createWindow= function() { someField.value = array1; })(); 如果我正在将其他文件中的array1对象引用到 另一个js文件是闭包,

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

utils.js

var array1 = [];
var array2 = [];
var array3 = [];
var array4 = [];
My Closures.js

(function() {

myObject.createWindow= function() {
     someField.value = array1;
})();
  • 如果我正在将其他文件中的array1对象引用到 另一个js文件是闭包,它会导致内存泄漏

  • 如果数组位于文件的根,则它是一个全局变量

    当然,这需要内存,但内存增长没有具体原因


    因此,这里没有内存泄漏的具体风险。

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

    当然,这需要内存,但内存增长没有具体原因


    因此,这里没有内存泄漏的具体风险。

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

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

    当无法再访问分配的内存时,将对其进行垃圾收集。因此,如果数组在仍然可以调用的闭包中被引用,它将不会被垃圾收集

    例如:

    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,所以它肯定不能被垃圾收集


    但正如另一篇文章所指出的,如果它们都具有全局作用域,那么它们都不会具有全局作用域,因为它们仍然可以在任何地方引用。

    当无法再访问分配的内存时,它会被垃圾收集。因此,如果数组在仍然可以调用的闭包中被引用,它将不会被垃圾收集

    例如:

    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,所以它肯定不能被垃圾收集


    但正如另一篇文章所指出的,如果它们都具有全局作用域,那么它们都不会具有全局作用域,因为它们仍然可以被引用到任何地方。

    如果在应该释放的时候不释放内存,则认为内存泄漏。将数组附加到全局名称空间意味着当全局名称空间被激活时,它们将被释放。换句话说,对于他们来说,泄漏是因为浏览器故障。在页面失去作用域之前,它们几乎永远不会被收集。在页面失去了您可以在代码中引入的范围之后,没有什么可以影响它们


    如果希望对数组进行垃圾收集,则将其放入某个范围,该范围在某个时候会丢失。当作用域丢失其作用域时,阵列将有资格进行垃圾收集(但不会立即进行垃圾收集)。

    如果内存在应该释放时未释放,则认为内存泄漏。将数组附加到全局名称空间意味着当全局名称空间被激活时,它们将被释放。换句话说,对于他们来说,泄漏是因为浏览器故障。在页面失去作用域之前,它们几乎永远不会被收集。在页面失去了您可以在代码中引入的范围之后,没有什么可以影响它们


    如果希望对数组进行垃圾收集,则将其放入某个范围,该范围在某个时候会丢失。当作用域失去其作用域时,数组将有资格进行垃圾收集(但不会立即进行垃圾收集)。

    如果我将它们包装在模块模式中,并在我的所有闭包中使用它,它会提供任何帮助还是保持原样。您在评论中提出的问题并不清楚。但是如果不复制阵列,就没有内存泄漏的原因。如果您看到内存在增加,我建议您使用并问一个精确的问题。@Java:将它们包装在模块模式中是一种很好的方式,可以减少对全局命名空间的污染,并允许垃圾收集更容易地识别不再可引用的对象。如果我将它们包装在模块模式中,并在我的所有闭包中使用它,它会有任何帮助还是保持原样。您在评论中的问题并不清楚。但是如果不复制阵列,就没有内存泄漏的原因。如果您看到内存在增加,我建议您使用并问一个精确的问题。@Java:将它们包装成模块模式是一种很好的方式,可以减少对全局命名空间的污染,并允许垃圾收集更容易地识别不再可引用的对象。您不需要“调用”数组。你在那里做的是引用数组。@T.J.Crowder你只是嫉妒你不知道如何“调用”数组,而我们都知道吗?:)我称之为“数组”。它们通常会出现。@T.J.Crowder:Array.call([],5)将创建一个长度为5的数组。@PO'Conbhui(等。):哈哈哈:-)您不会“调用”数组。你在那里做的是引用数组。@T.J.Crowder你只是嫉妒你不知道如何“调用”数组,而我们都知道吗?:)我称之为“数组”。它们通常会出现。@T.J.Crowder:Array.call([],5)将创建一个长度为5的数组。@PO'Conbhui(等人):哈哈哈:-)是否有理由对此进行否决?如果不查看int,就很难确定这是否会导致内存泄漏