javascript - 当我清除数组时,数组内的 javascript 对象是否会从内存中删除?

标签 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;
}

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

谢谢!

最佳答案

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

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

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

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

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

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

2) 在声明之前不要调用函数。是的,它可以工作,但是它很乱而且以后更难阅读。请记住,您阅读代码所花费的时间远多于编写代码所花费的时间。方便以后跟进。

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

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

5) 使用间距。文字的密度不及虔诚。您现在可能 20 多岁,视力很好,但您会在短短几年内欣赏空白。

6) 在 for 循环中用 var 声明计数器。除非您希望它们是全局性的。而你几乎永远不会。

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

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 );

关于javascript - 当我清除数组时,数组内的 javascript 对象是否会从内存中删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14226825/

相关文章:

php - 在表单的隐藏字段中存储方法

javascript - 如何设置下拉菜单的速度?

unix - 如何在 MacOS X 上找到堆栈的基地址和大小?

隐藏阶段时的JavaFX 8内存泄漏

java - 为什么字节图比位图快?

javascript - 我的 HTML5 游戏时不时会卡顿,如何判断是不是垃圾回收引起的?

javascript - Node JS 无法读取未定义的属性 'length'

javascript - 在 javascript 中解释自定义 Error 对象并与之交互

javascript - 删除javascript中的对象引用

python - 饥饿的 Python worker 的内存泄漏