为什么console.log在"之外?#34;循环打印出"额外"数?

时间:2015-04-25 02:30:48

标签: javascript for-loop

我正在处理一些简单的Javascript代码,而且我确定无法理解。当我输入此代码时,

for (var x = 0; x < 5; x++)
{
    console.log(x);
}

自然,它打印出0到4.但如果我添加

for (var x = 0; x < 5; x++)
{
    console.log(x);
}
console.log(x);

然后它将打印出0到5.为什么打印出5?

4 个答案:

答案 0 :(得分:3)

必须检查并查看x是否大于5,否则循环将永远不会结束。

如果x等于4,则会运行循环并再次x再增加1,使x返回5。当它检查x是否小于5时,它会评估为false并结束循环。

因此,当循环结束时,x等于5

答案 1 :(得分:1)

这完全正常!

最后一次迭代不是第5次(打印&#34; 4&#34;,如预期的那样),但是第6次,它发现x值(&#34; 5&#34) ;)超出了定义的限制。

由于for语句不是闭包,因此在循环结束时存在var x个静止图像,因此它会打印其值。

答案 2 :(得分:1)

我理解For while的简短版本。

for(<start>, <condition>, <change>) {
    <loop>
}
<end>

等于:

<start>
while(<condition>){
    <loop>
    <change>
}
<end>

您可以看到<change><loop>之后,但在下一次<condition>检查之前。{/ p>

  • 检查条件
  • 进行更改
  • 检查条件
  • 进行更改
  • 检查条件,失败,退出循环

你可以看到,在适用的地方发生了变化。

如果你不想发生这种情况

使用do-while循环。但在某些情况下,你必须首先检查状况。例:

<start>
if(<condition>){
    do {
        <loop>
        <change>
    } while(<condition>);
}
<end>

还有其他方法,但它只是语法,而不是algorythm的变化。

答案 3 :(得分:0)

一些额外的考虑因素。这解释了为什么'x'仍在最后一个console.log(x)的范围内。范围在其他语言中可能不会这样。

请参阅MDN for the "initialization parameters" of a for-loop

  

表达式(包括赋值表达式)或变量   宣言。通常用于初始化计数器变量。这个   表达式可以选择使用var关键字声明新变量。   这些变量不是循环的局部变量,即它们是相同的   for循环所在的范围。此表达式的结果将被丢弃。

来自MDN

  

重要说明:JavaScript没有块范围。变量介绍   带有块的范围限定在包含函数或脚本,以及   设置它们的效果持续超出块本身。其他   单词,块语句不引入范围。虽然   “standalone”块是有效的语法,你不想使用   JavaScript中的独立块,因为它们没有按照您的想法执行   他们这样做,如果你认为他们做了像C或Java这样的块。

(这是insertusernamehere和用户2718994从this question开始的答案