for循环的奇怪行为

3

有人能告诉我为什么 for 循环即使在失败迭代时也会增量吗?

for (var n = 0; n <3; n++) {
     alert(n);                  // displays 0 , 1 , 2 
}
alert(n); // gives 3 

但是它不应该像这样吗?
if(condition):
    //desired stuff
    increment;
else:
    exit;

我很少使用迭代变量,大多数情况下,在循环完成后我只是扔掉它们,但在这种情况下,我发现它是一个错误的原因。


1
你还能想到什么其他的方式来使得条件检查失败,如果 n 没有被增加到 3 呢?它的值不会因为不再满足循环的条件而恢复到 2。 - JonK
这是因为Javascript中的每个变量都属于函数作用域。这意味着在函数之后,n仍然存在。 - Walfrat
实际上,在你的例子中,它应该弹出“2”,还是我漏掉了什么? - sinisake
哎呀,应该是 n < 3; :p - Vinay
@JonK 2<2 会失败吗? - Vinay
我们还在尝试解决什么问题吗? - sg-
4个回答

10

在概念上,n++被称为循环主体的最后一条语句之后执行,而停止条件在循环主体的第一条语句之前评估。

因此,您的代码等效于

for (var n = 0; n < 3; ) {
     alert(n);
     n++;
}

从这个角度来看,循环结束后 n 为3的原因应该是显而易见的。

请注意,在Javascript中,n泄漏for 循环。


1
但是如果 n == 2,n++ 就无法运行。它只能运行到 n == 1(即:n < 2)。 - sg-
@sg-Oops。笔误:for循环与OP的方式相同,除了我将n++移动了。 - Bathsheba
明白了!它总是会增加,否则相等的情况就无法正常工作。 - Vinay
当循环退出时,n将始终处于第一个失败条件。 - Bathsheba

2
for (var n = 0; n <3; n++) {
    alert(n);                 
}
alert(n);

for循环的工作方式如下:

  1. 首先将n初始化为0;

  2. 然后检查条件是否为真,这种情况下条件是n<3。

    1. 最后增加n并再次检查条件,如果条件为真,则再次进入for块。如果条件为假,则退出for循环。

在您的代码中,当n = 3时,条件变为false。因此,n的最终值为3。


0

刚刚在Chrome控制台执行了代码:

enter image description here

它按预期工作。


1
@Bathsheba:在您的回答中提到的行为如果循环条件是"<= 2"或"< 3"的话,是不应该发生的吗? - deChristo

0

由于您已经评论说n将与3一起警报,这是错误的,因为当n2时,将检查条件,即2<2将是错误的,然后它将从循环中跳出并警报2而不是3


没错,但当它退出循环时,k将会是3,因为循环无论如何都会对其进行递增。 - Vinay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接