引發這個問題思考的是一段js程序的運行結果:
複製代碼代碼如下:
var i = 0;
function a(){
for(i=0;i<20;i++){
}
}
function b(){
for(i=0;i<3;i++){
a();
}
return i;
}
var Result = b();
這段程序的運行結果是Result = 21;
從這段程序中我們可以看出,i在a函數返回的時候值是20這是沒有問題的。
而在b函數返回的時候,i的值是20還是21就值得討論了。
問題的本質即:先進行了判斷i<3,還是先進行了i++,再判斷是否i<3.
根據執行的結果可以看出,是先執行了i++的。
複製代碼代碼如下:
function a(){
for(i=0;i<20;i++){
// 沒有var i
//這裡的i就是全局變量所有人可以訪問
}
}
function b(){
for(i=0;i<3;i++){
//alert(i);//同理這裡的i也是全局變量,返回0且只有一次返回
a();//這個函數返回是i=20
//當i=20 經過i++後i=21 那麼就不符合i<3的條件,直接退出。所以return i=21 這很正常!
}
return i;
}
var Result = b();
在此我們補完for循環的執行順序:
以下面程序為例
複製代碼代碼如下:
for(int i=0;i<10;i++)
{
}
首先執行i=0;i<10; 然後執行第一輪循環體
然後執行:i++,i<10; 然後執行第二輪循環體
直到最後一次i++後i >=10,此時循環結束。
即
語句1 在循環(代碼塊)開始前執行
語句2 定義運行循環(代碼塊)的條件
語句3 在循環(代碼塊)已被執行之後執行