适用于/在变量声明中

时间:2011-03-28 19:58:05

标签: javascript syntax for-in-loop

for / in循环中声明循环特定变量的正确语法是什么?

前两个似乎都工作(并且不会在Google Closure Compiler中引发任何标志),但只有第三个通过了Crockford的JS Lint。我不愿意使用它,主要是因为它不紧凑。

JSLint抱怨val是一个坏变量(当我不添加var时),或者应该移动声明。

第一个或第二个选项有任何缺点吗?我该怎么用? (示例假设str是声明的字符串,vals是声明的对象)

1。没有声明:

for(val in vals)
{
    if(vals.hasOwnProperty(val))
    {
        str += val;
    }
}

2。在'for'var声明中:

for(var val in vals)
{
    if(vals.hasOwnProperty(val))
    {
        str += val;
    }
}

3。在循环var声明之外:

var val;
for(val in vals)
{
    if(vals.hasOwnProperty(val))
    {
        str += val;
    }
}

3 个答案:

答案 0 :(得分:3)

随意忽略JSLint。这比任何事情都更准确。第二和第三功能相同,随意使用(我使用第二个)。第一个公开了一个全局'val'变量,所以不要这样做:)

仅供参考,第三个背后的原因是内联变量声明比发现/查找更难:

var a, b, c, d, e;

位于函数顶部。

答案 1 :(得分:1)

除了在变量声明背后的cwolves推理之外,JSLint还在考虑variable hoisting

话虽这么说,我在写循环时更喜欢选项#2。不过,我确实在函数的顶部定义了其余的变量。所以我喜欢:

function foo(a) {
  var b, c = {d: "e", f: "g"};

  for (var i = 0, j = a.length; i < j; i += 1) {
    ...
  }

  for (var h in c) {
    if (c.hasOwnProperty(h)) {
      ...
    }
  }      
}

答案 2 :(得分:1)

1。选项

val变量成为隐式全局变量。 隐含的全局变量是100%糟糕的,应该避免。

2。和3.选项

val变量成为包含范围的变量。如果您的代码在函数内,则val变量将成为该函数的局部变量。两种选择都是等价的。 (我更喜欢2.选项。)

JSLint将抛出,因为Crockford的想法是始终在代码顶部声明所有变量。这对于更大的代码(例如> 100行)更有意义 - 在这种情况下,您可以考虑将声明移出for和for-in语句,并将它们放在代码的顶部。这样,您就可以很好地了解所有局部变量。