3

我从来没有真正考虑过垃圾收集,我不知道在制作小型 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;
}

所以我的问题是,当我说foos=[](第 5 行)时,这是否会从内存中删除该数组中的对象,或者它们是否漂浮在某个地方,从而使程序变得更大更慢?如果我想generateFoos()多次调用loooot,比如每次用户按下一个键,我应该怎么做。

谢谢!

4

2 回答 2

8

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

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

重要的一点,删除 DOES NOT GARBAGE COLLECT

你一遍又一遍地看到这一点,甚至在这个问题的评论中。delete关键字从对象中删除一个属性,与垃圾回收无关。

我还想就您的代码本身提供一些建议。

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 );
于 2013-01-09T02:11:42.623 回答
6

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

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

考虑垃圾收集时最好的建议是让垃圾收集器去做它的工作。不要试图指导它或帮助它(例如手动将引用归零)。关注代码的问题和功能方面。

于 2013-01-09T01:32:16.147 回答