2

我不知道如何最好地处理forJavaScript 中的循环。希望对for循环的理解将有助于阐明其他类型的循环。

示例代码

for (var i=0; i < 10; i=i+1) {
    document.write("This is number " + i);
}

我的理解是,当i已初始化时,它以0which 的值开始,然后根据条件进行评估< 10。如果小于10,则执行语句document.write("This is number + i);一旦执行了前面的语句,它才会将下一个值增加1

我咨询过的指南:

  1. http://www.functionx.com/javascript/Lesson11.htm
  2. http://www.cs.brown.edu/courses/bridge/1998/res/javascript/javascript-tutorial.html#10.1
  3. http://www.tizag.com/javascriptT/javascriptfor.php

现在http://www.functionx.com/javascript/Lesson11.htm上的指南似乎另有说明,即

要执行此循环,请检查开始条件。这通常是开始计数的初始值。接下来,测试Condition;此测试确定循环是否应该继续。如果测试呈现真实结果,则使用表达式修改循环并执行语句。执行完语句后,循环重新开始。

抛出我的行是“如果测试呈现真实结果,则表达式用于修改循环并执行语句”。这似乎暗示因为0小于10,增量表达式被修改,这将是0 + 1然后执行语句,例如document.write

我的问题

for解释循环的正确方法是什么?我自己的理解正确吗?相同的理解是否适用于其他编程语言,例如 PHP、Perl、Python 等?

4

6 回答 6

8

将 for 循环想象如下

for(initializers; condition; postexec) {
    execution
}
  1. 当循环首次启动时,代码var i = 0将运行。这会初始化您将在循环内测试的变量

  2. 接下来循环计算i < 10表达式。这将返回一个布尔值,该值将在前 10 次运行时为真。当这个表达式一直评估为真时,循环内的代码会运行。

    document.write("This is number " + i);

  3. 每次运行此代码后,i++都会执行循环的最后一部分。此示例中的此代码在i每次执行后加 1。

执行该代码后,检查循环条件并重复步骤 2 和 3,直到最终条件为假,在这种情况下退出循环。

这是循环在您提到的语言中工作的方式。

于 2012-06-20T01:20:37.060 回答
5

让我们看一下ECMAScript 规范中的相应部分

产生
式 IterationStatement : for ( var VariableDeclarationListNoIn ; Expression opt ; Expression opt) 语句
的评估如下:

1. Evaluate VariableDeclarationListNoIn.
2. Let V = empty.
3. Repeat
  a. If the first Expression is present, then
     i. Let testExprRef be the result of evaluating the first Expression.
     ii. If ToBoolean(GetValue(testExprRef)) is false, 
         return (normal, V, empty).
  b. Let stmt be the result of evaluating Statement.
  ...
  f. If the second Expression is present, then
     i. Let incExprRef be the result of evaluating the second Expression.
     ii. Call GetValue(incExprRef). (This value is not used.)

如您所见,在第 1 步中,评估了变量赋值。在步骤 3a 中,测试条件。在步骤 3b 中,评估循环体,然后步骤 3f 中评估第三个表达式。

因此,您对for循环的理解是正确的。


假设它在其他语言中的工作方式相同,因为for循环在编程语言中是如此常见的语句(注意 Python 没有这样的语句)。但是,如果您想绝对确定,最好也参考他们的规范。

于 2012-06-20T01:26:44.660 回答
4

您引用的来源是错误的,我们可以证明...

for 循环的基础有四个可以执行的独立块:

for( initialise; condition; finishediteration) { iteration}

幸运的是,我们可以在每个块中执行一个函数。因此,我们可以创建四个函数,它们在执行时会记录到控制台,如下所示:

var initialise = function () { console.log("initialising"); i=0; }
var condition = function () { console.log("conditioning"); return i<5; }
var finishediteration = function () { console.log("finished an iteration"); i++; }
var doingiteration = function () { console.log("doing iteration when `i` is equal", i); }

然后我们可以运行以下命令,将上述函数放入每个块中:

for (initialise(); condition(); finishediteration()) {
    doingiteration();
}

卡布姆。作品。

如果您在 Mac 上使用 Safari 查看此页面,则可以AppleAlt+I并将上述两个片段按顺序复制到控制台中并查看结果。

编辑,额外信息....

另外...完成的迭代块是可选的。例如:

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

确实有效。

于 2012-06-20T01:52:06.917 回答
2

第二个参考是错误的。你的解释是正确的。

于 2012-06-20T01:20:53.133 回答
1

如果这对您有帮助,另一种思考方式:

var i = 0;
while (i < 10) {
    document.write("This is number " + i);
    i++;
}
于 2012-06-20T01:24:54.663 回答
0

这是for语句语法:

for(initalize, condition, increment) {
    Do_some_things();
}

initalizeforbegin时只执行一次then 执行Do_some_things();语句,而condition仍然true执行incrementthen Do_some_things();。如果 cocondition为假,for 将退出。

for (var i=0; i < 10; i=i+1) {
    document.write("This is number " + i);
}

var i=0将执行一次(初始化)。 i < 10循环后总是检查条件。 i=i+1将在检查后执行i < 10,结果为真。i的值为:0、1、3、4、5、6、7、8、9(10次循环)

于 2012-06-20T01:25:10.343 回答