清除数组时,数组内的javascript对象是否从内存中擦除?

Nic*_*ing 3 javascript garbage-collection

我从来没有真正考虑垃圾收集,我不知道在制作小型javascript游戏/应用程序时是否有必要考虑.任何建议都表示赞赏,但最后我会问我的具体问题.

很多时候我都会编写这种形式的代码:

var foos=new Array();
generateFoos();
function generateFoos()
{
    foos=[];
    for (fooIndex=0;fooIndex<numberOfFoos;fooIndex++)
    {
        foos[fooIndex]=new foo(Math.random(),Math.random());
    }
} 
function foo(bar,bas)
{
   this.bar=bar;
   this.bas=bas;
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,当我说foos=[](第5行)时,这是从内存中删除该数组中的对象还是在某处浮动,使程序变大和变慢?如果我想在generateFoos()每次用户按键时调用一次时间,我该怎么办?

谢谢!

Geu*_*uis 8

对于特定的答案,由于接受的答案实际上没有直接回答问题,是的,foo = []确实取消引用数组中的任何先前值.

正如Ales所说,"当一个对象变得无法访问时,它就有资格进行垃圾收集." 实际上,这是浏览器从内存中清除这些内容的时候.

重要的一点是,删除不要垃圾收集.

你一遍又一遍地看到这一点,甚至在这个问题的评论中.该删除关键字从对象中删除一个属性,并没有任何垃圾回收.

我还想就你的代码本身提供一些建议.

1)对基本数据类型使用文字而不是新文字

2)在声明函数之前不要调用函数.是的,它可以工作,但是后来它的杂乱和难以阅读.请记住,您花费更多时间阅读代码而不是编写代码.以后可以轻松搞定.

3)记住你的功能范围.声明没有var的任何变量都是全局的.使用var,它仍然在包含它的函数的范围内.变量在函数中作用域的另一种方式是将它们作为命名参数传入.

4)在创建函数时使用var.在您的代码中,您的函数是全局变量.

5)使用间距.文字的密度不是敬虔的旁边.你现在可能有20多岁,视力很好,但你会在短短的几年内欣赏到白色空间.

6)使用var声明for循环中的计数器.除非你希望它们是全球性的.你几乎永远不会.

让我们现在重新编写代码:

var numberOfFoos = 10,
    foos = [];

var generateFoos = function(){

    foos = [];

    for( var fooIndex = 0; fooIndex < numberOfFoos; fooIndex++ ){

        foos[ fooIndex ] = new foo( Math.random(), Math.random() );

    }

},

foo = function( bar, bas ){

   this.bar = bar;
   this.bas = bas;

}

generateFoos();
console.log( foos );
Run Code Online (Sandbox Code Playgroud)


Ale*_*leš 6

回答您的问题:当一个对象无法访问时,它就有资格进行垃圾回收.如果您的程序没有对该数组中的对象进行任何其他引用,则它们将被垃圾回收.

实际垃圾收集的时间取决于许多方面和选择的垃圾收集算法,但在编写代码时不必担心.

最好的建议时,考虑到垃圾收集是要离开的垃圾回收器来完成其工作.不要试图指导它或帮助它(例如通过手动归零引用).专注于代码的问题和功能方面.

  • 记住意识仍然是一个好主意.例如,Javascript应用程序中的一个主要内存泄漏源是由处理程序绑定到全局事件,然后永远不会删除它们,即使它们不再需要它们也是如此. (2认同)