【问题标题】:Proper for/in variable declaration适用于/in 变量声明
【发布时间】:2011-07-24 18:38:10
【问题描述】:

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 val;
for(val in vals)
{
    if(vals.hasOwnProperty(val))
    {
        str += val;
    }
}

【问题讨论】:

    标签: javascript syntax for-in-loop


    【解决方案1】:

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

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

    var a, b, c, d, e;
    

    在函数的顶部。

    【讨论】:

    • 确实如此。 总是使用var在本地声明你的变量,永远不要省略那个关键字。
    • @yc - 没关系。如果未声明,调用的匿名函数仍会泄漏全局变量。
    【解决方案2】:

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

    话虽如此,在编写 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)) {
          ...
        }
      }      
    }
    

    【讨论】:

      【解决方案3】:

      1。选项

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

      2。和 3. 选项

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

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

      【讨论】:

        猜你喜欢
        • 2017-05-30
        • 2013-08-31
        • 1970-01-01
        • 2014-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多