2

forJavaScriptでループにアプローチする最善の方法がわかりません。forループを理解することが、他のタイプのループに光を当てるのに役立つことを願っています。

サンプルコード

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

私の理解では、iが初期化されると、その値から始まり0、条件に対して評価されます< 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のガイドは、そうでないことを示しているようです。

このループを実行するために、開始条件がチェックされます。これは通常、カウントを開始する初期値です。次に、条件がテストされます。このテストは、ループを続行するかどうかを決定します。テストで真の結果が得られた場合は、式を使用してループを変更し、ステートメントを実行します。ステートメントが実行された後、ループが再開されます。

私を投げる行は、「テストが真の結果をレンダリングする場合、式を使用してループを変更し、ステートメントが実行される」です。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回はtrueになるブール値を返します。この式がtrueと評価され続ける間、ループ内のコードが実行されます。

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

  3. このコードが実行されるたびに、ループの最後の部分i++が実行されます。この例のこのコードは、i実行ごとに1を追加します。

そのコードが実行された後、ループの条件がチェックされ、最終的に条件がfalseになるまで手順2と3が繰り返されます。この場合、ループは終了します。

これは、あなたが言及した言語でループが機能する方法です。

于 2012-06-20T01:20:37.060 に答える
5

ECMAScript仕様の対応するセクションを見てみましょう。

プロダクション
IterationStatementfor ( var VariableDeclarationListNoIn ; Expression optExpressionopt ; ステートメントは次のよう に評価されます)

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で3番目の式が評価されます。

したがって、forループの理解は正しいです。


ループはプログラミング言語では非常に一般的なステートメントであるため、他の言語でも同じように機能すると想定しforます(Pythonにはそのようなステートメントがないことに注意してください)。しかし、絶対に確信したい場合は、それらの仕様も参照することをお勧めします。

于 2012-06-20T01:26:44.660 に答える
4

あなたの引用された情報源は間違っています、そして私たちはそれを証明することができます...

forループの基礎には、実行できる4つの別個のブロックがあります。

for(initialise;; conditionfinishediteration{ iteration}

幸い、これらの各ブロックで関数を実行できます。したがって、次のように実行されたときにコンソールにログを記録する4つの関数を作成できます。

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を使用してこのページを表示している場合は、上記の2つのスニペットを順番にコンソールにコピーして、結果を確認できますAppleAltI

編集、追加情報...

また...完成した反復ブロックはオプションです。例えば:

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

動作します。

于 2012-06-20T01:52:06.917 に答える
2

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();
}

initalizefor開始時に1回だけ実行され、次にDo_some_things();ステートメントが実行され、conditionそれでも実行されてから。co falseの場合、forは終了します。trueincrementDo_some_things();condition

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

var i=01回実行されます(初期化)。 i < 10条件はループの後に常にチェックされました。 i=i+1チェック後に実行されi < 10、結果はtrueです。iの値は次のとおりです:0、1、3、4、5、6、7、8、9(10回のループ)

于 2012-06-20T01:25:10.343 に答える