2011-10-11 109 views
1

我想知道是否更有效的方法是在循环之外放置任何引用的变量,或者它们是否可以像函数中的变量一样收集垃圾?循环内部的局部变量是否被垃圾收集?

var obj = {key:'val'}; 
for(var i=0; i<10; i++){ 
    console.log(obj); 
} 

for(var i=0; i<10; i++){ 
    var obj = {key:'val'}; 
    console.log(obj); 
} 

我试图运行在浏览器中的探查一些内存测试,但仍无法判断哪个方法更好。

回答

6

var是函数作用域,没有阻塞作用域,所以无论它们是否出现在循环内部都没关系。 What is the scope of variables in JavaScript?解释了这种区别。

JavaScript的下一个版本将有let-scoped变量,并且如果在循环内部声明,那么存储在这些变量中的值将在循环体运行结束时变为可收集的。

+0

请注意,在风格上(为了避免让代码读者感到困惑),建议始终在函数的开头定位'var'语句。 – intuited

+0

@intuited,好点。我认为像JSLint这样的工具强制执行。 –

+0

[It does](http://javascript.crockford.com/code.html#variable%20declarations)。 – intuited

1

在变量超出范围之前,都不会收集垃圾。 Javascript中的作用域是由函数引入的。循环构造对范围无任何影响。

+0

感谢您的信息。出于任何原因,哪种方法比其他方法更好? –

+0

在循环中一遍又一遍地重新声明对象并没有什么意义,所以1似乎更合适。 – deceze

0

就垃圾收集而言,其他答案应该是true,浏览器处理垃圾收集,并且如果变量在内部或外部声明为循环,则无关紧要。

至于效率,您的代码会稍微优化一些,以便在循环之前声明变量。