この問題を引き起こしたのは、JSプログラムの実行の結果です。
コードコピーは次のとおりです。
var i = 0;
関数a(){
for(i = 0; i <20; i ++){
}
}
関数b(){
for(i = 0; i <3; i ++){
a();
}
私を返します。
}
var result = b();
このプログラムが実行された結果は結果= 21です。
このプログラムから、関数Aが戻るときにIの値が20であることに問題はないことがわかります。
B関数が戻ると、Iの値が20か21かどうかを議論する価値があります。
問題の本質は、最初にi <3またはi ++が最初に実行されるかどうかを判断し、次にi <3かどうかを決定します。
実行の結果によると、I ++が最初に実行されたことがわかります。
コードコピーは次のとおりです。
関数a(){
for(i = 0; i <20; i ++){
// var i
//ここにある私は、誰もがアクセスできるグローバル変数です
}
}
関数b(){
for(i = 0; i <3; i ++){
// alert(i); //同様に、私はここにもグローバル変数であり、0を返し、1回しか返されません
a(); //この関数はi = 20を返します
// I = 20がI ++とi = 21を通過すると、I <3の条件を満たし、直接終了しません。したがって、i = 21を返しますこれは正常です!
}
私を返します。
}
var result = b();
ここで、forループの実行順序を完了します。
次のプログラムは例です
コードコピーは次のとおりです。
for(int i = 0; i <10; i ++)
{
}
最初にi = 0; i <10を実行します。そして、ループ本体の最初のラウンドを実行します
次に実行:i ++、i <10;次に、ループ本体の第2ラウンドを実行します
I> = 10の後の最後のI ++まで、ループは終了します。
今すぐ
ステートメント1は、ループ(コードブロック)が始まる前に実行されます
ステートメント2は、ループを実行する条件を定義します(コードブロック)
ステートメント3がループ(コードブロック)が実行された後に実行されます