在JavaScript循环中声明相同的变量名称

时间:2014-07-08 18:00:35

标签: javascript loops variables

这个例子清楚了(参见变量entry声明):

var list = { a:1, b:2, c:3 }, entry;

for( var i in list )
{
    entry = list[ i ];

    // ...
}

“严格使用”没有错误,但以这种方式声明entry是一种好习惯吗?

var list = { a:1, b:2, c:3 };

for( var i in list )
{
    var entry = list[ i ];

    // ...
}

5 个答案:

答案 0 :(得分:3)

JavaScript没有块级范围。因此循环内的var entry也可以在循环外部使用(即,两个声明都相同)。为了便于阅读,我喜欢在循环中声明它们,只是为了清楚地表明该变量仅在循环中使用(即使我知道它在外部可用)。如果您希望在循环外使用entry,请在外面声明它;不要在里面声明它,然后最终在外面使用它(对于阅读代码的人来说可能会让人感到困惑,即使代码有效)。

答案 1 :(得分:1)

JavaScript没有块范围 - 只有函数范围,所以两者应该是相同的。

循环中的变量将是"悬挂"像在第一个例子中那样在功能级别声明。

同样的概念实际上也适用于var i。它也将被提升到功能的顶部。

第二种模式的一个微优化是您将较少的代码传输到客户端。如果名字超长,这将更加明显。虽然不是一个实际的原因。

然而,包含var关键字非常重要。否则它会被提升"进入全球范围,几乎所有时间都是不受欢迎的。

答案 2 :(得分:1)

这取决于你想做什么。如果要遍历列表,执行一些操作并保留最后一个条目,则第一种方式是明确的。如果没有,最好保持代码清晰。很久以前我听到过一种智慧,"在使用它们之前声明你的变量。"当您正确声明变量时,没有理由严格抱怨。

if (1) {
    var x = 'hey';
}
console.log(x);

http://jsfiddle.net/8X2C3/1/ - 我没有意识到JavaScript是功能级别范围。那太可悲了。不要像我在示例中那样做。我一直在PHP中看到它,它使代码无法读取。

答案 3 :(得分:0)

当你在JavaScript中声明一个变量时,你正在分配大量的内存,我不确定多少。是的,JavaScript没有块级范围,理论上该变量的声明应该替换与原始变量相同的内存位置,但它可能会在"垃圾收集器之前复制内存位置&# 34;来照顾它。在for循环中声明变量可能会导致内存大量增加,并且无论如何都不是一个好习惯。是的,内存最终将被清除,但只有一次"垃圾收集器"绕过它。我会建议你按照第一种方式声明你的变量。

答案 4 :(得分:0)

由于变量托管与var语句一起发生,因此将变量声明保留在函数顶部通常是一种更好的做法(尽管主要是基于意见的)。

当你有很多局部变量时,可能会损害可读性,但是有许多局部变量也表明可以进行一些重构,例如Extract Method

另请注意,let语句将允许ES6中的块范围。

相关问题