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