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()每次用户按键时调用一次时间,我该怎么办?
谢谢!
对于特定的答案,由于接受的答案实际上没有直接回答问题,是的,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)
回答您的问题:当一个对象无法访问时,它就有资格进行垃圾回收.如果您的程序没有对该数组中的对象进行任何其他引用,则它们将被垃圾回收.
实际垃圾收集的时间取决于许多方面和选择的垃圾收集算法,但在编写代码时不必担心.
在最好的建议时,考虑到垃圾收集是要离开的垃圾回收器来完成其工作.不要试图指导它或帮助它(例如通过手动归零引用).专注于代码的问题和功能方面.
| 归档时间: |
|
| 查看次数: |
1981 次 |
| 最近记录: |