4

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

前两个似乎都可以工作(并且不会在 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;
    }
}
4

3 回答 3

3

随意忽略 JSLint。这比什么都重要。第二个和第三个在功能上是相同的,随意使用(我使用第二个)。第一个公开了一个全局“val”变量,所以不要这样做:)

仅供参考,第三个背后的原因是内联变量声明比:

var a, b, c, d, e;

在函数的顶部。

于 2011-03-28T20:02:42.147 回答
1

除了 cwolves 在变量声明背后的推理之外,JSLint 也在考虑变量提升

话虽如此,在编写 for 循环时,我更喜欢选项 #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)) {
      ...
    }
  }      
}
于 2011-03-28T20:11:34.650 回答
1

1. 选项

val变量成为隐式全局变量。隐式全局变量是 100% 不好的,应该避免。

2. 和 3. 选项

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

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

于 2011-03-28T20:17:53.950 回答