变量的隐藏增量发生

时间:2013-12-26 12:52:52

标签: javascript variables loops scope

这里的基本问题..秒console.log(k);打印出10而不是9,为什么会这样?

function test (o) {
  var i = 0;
  if(typeof o == "object") {
      var j = 0;
      for(var k=0;k<10;k++){
          console.log(k);
      }
      console.log(k);
  }
  console.log(j);
}

test(o);

4 个答案:

答案 0 :(得分:0)

在“k <10”条件失败之前,循环不会停止。此时“k ++”已经运行,在这种情况下,k等于10.这意味着当循环结束时,k将仍然是10,这就是打印!

当然,循环内部仅在条件成功时运行,这就是为什么它将停在“9”。

旁注

顺便说一下,整个声明首先起作用的原因是因为javascript不像其他语言那样强烈地强制执行变量作用域。换句话说,在许多语言中,如果在循环中声明变量,则不允许在循环外使用该变量(至少如果变量是基本类型)。

我意识到这个问题可能完全是学术性的,但总的来说,我的政策是在javascript中使用“var”关键字声明变量,以确保我不会覆盖全局变量,我也会尽量避免像这样的情况通过观察“C”遗产范围规则。换句话说,虽然这是一个有趣的问题 - 它可能应该避免编码实践。希望将来为其他人提供一些指导!

答案 1 :(得分:0)

在这一行

for(var k=0;k<10;k++){
  console.log(k);
}

k增加k++增量。在最后一次迭代时,k = 10条件失败,下一个console.log(k)打印值k10

答案 2 :(得分:0)

简短的回答是:如果您希望k为9,那么您不能指望for循环同时结束,因为if (k === 9) console.log(k<10);将记录 true ,因此您的第二个console.log(k)将无法执行。
而已。现在答案很长:

嗯,基本上,for循环由3个不同的语句组成:

for (var k=0;k<10;k++)

您需要了解JS何时执行每个语句。在第一种情况下,它非常简单:

k=0

当JS进入循环时执行赋值,然后(执行循环之前)将评估条件:

k<10 // == 0 < 10 == true

执行循环体,然后在评估条件之前,执行第三个语句:

k++//increment k, k is 1 now

一切顺利,现在,假设

for(k=9;k<10;k++)

并应用相同的逻辑。循环体将执行一次,k递增,现在保持10作为值。条件评估为false,JS将不再循环。
因为JS不是真正的块范围,k将很高兴地坐在内存中直到它再次需要,并且因为你没有重新分配它,它仍然会保持10作为值。

非常简单。它实际上就像我所知道的大多数语言......

答案 3 :(得分:0)

  • “for”循环有效,只要k <10,这意味着如果k = 9控制台应打印出9
  • 在循环结束时}它必须基于k ++递增k,这意味着k = k + 1,这使得k = 10
  • 根据您的k&lt; 10规则,它必须离开循环,并且由于第二个控制台日志请求,控制台应打印出10