这里的基本问题..秒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);
答案 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)
打印值k
为10
。
答案 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)