在for-statments中声明的变量似乎是全局的

时间:2015-08-19 09:17:39

标签: javascript global-variables

这让我在昨天绊倒了,我在递归函数中有奇怪的行为。我设法重现并注意到其他行为。基本上,下面的html / js中的 i 变量似乎是全局的。输出为4,然后是5.我使用FF 40.0.2。截至上周(ish),最新版本的Node.js出现了同样的问题。我没有注意到它的版本号。

是什么给出的?这应该是这样的吗?问题消失了我在每个for语句的上方声明了循环变量。

<head>
  <script>

    function foo(recurse)
    {
      if (recurse)
      {
        for (i = 0; i < 2; ++i)
        {
          foo(false);   
          console.log(i);
        }
      }
      else
      {
        for (i = 0; i < 4; ++i)
        {}
      }
    }

    foo(true);

  </script>
</head>

预期产出:

0
1

实际输出:

4

不确定要标记此内容。

1 个答案:

答案 0 :(得分:1)

嗯,问题是你没有声明 他们,所以他们是implicitly global。让他们vars

function foo(recurse) {
  if (recurse) {
    for (var i = 0; i < 2; ++i) {
//       ^^^
      foo(false);
      console.log(i);
    }
  } else {
    for (var i = 0; i < 4; ++i) {}
//       ^^^
  }
}

foo(true);

你也可以尝试strict mode,在那里你会得到一个未处理的错误Assignment to unresolved reference in strict mode code: i