3 回答

TA貢獻158條經驗 獲得超188個贊
其實你在問題不在于遞歸,關于結果為什么是23456而不是2345正如樓上所說,我來補充下為什么一開始是1后來變為2,然后結果是23456吧。
這里主要是涉及到文檔流以及document.open(); document.write(); document.close();這三個方法的相關知識,
document.open()這個方法可以打開一個文檔流用于接受document.write方法寫入的內容,并且(在文檔流已關閉的情況下)會清除當前的文檔內容。
一般很少用到open方法是因為在文檔流關閉后再調用write方法時瀏覽器會自動調用open方法打開一個新的文檔流,但是并不會自動調用close方法來關閉文檔流,在文檔流未關閉的情況下調用write會將內容寫入到你document.write()語句所在的位置,如果多次調用則會依次寫入到前一次調用寫入的內容之后。
然后再來看你的問題,瀏覽器 document.write()語句寫到了函數a里并且在script標簽里直接調用了函數a一次,瀏覽器解析HTML生成DOM樹時碰到script標簽會先執行里面的js再繼續解析下面的html標簽,而在解析過程中(即頁面未onload完成時)文檔流是處于未關閉的狀態的,此時調用函數a(),執行里面的document.write()語句,并不會打開新的文檔流并且清除當前文檔內容,所以你就看到了最開始的“1”。
再然后由于你在函數內加了定時器遞歸調用函數a,但是在1000毫秒之后HTML已經解析完畢(onload,文檔流已關閉),此時第二次調用了document.write()方法,由于文檔流已關閉所以瀏覽器自動調用document.open()方法打開了新的文檔流并且清除了當前文檔內容(即清除了之前的“1”),頁面上能看到的內容就變成了“2”,同時因為瀏覽器不會自動調用document.close()方法,所以此時的文檔流一直處于未關閉狀態,之后的幾次遞歸調用函數里write的i值都不會清除當前內容再輸出,而是直接跟在上一次輸出的內容之后,等滿循環完畢后輸出的內容就成了“23456”了。
//?如果你的js這么寫就不會出現23456了,而是會依次刷新并輸出1、2、3、4、5、6(最后只能看到6) var?i?=?0; function?a()?{ ????i++; ????document.write(i); ????document.close(); ????if?(i?>?5)?{ ????????return; ????} ????setTimeout(a,?1000); } a();
(最后建議樓主一般情況下不要用document.write方法,特別是調試的時候,調試多用alert和console,純手打望采納=、=)

TA貢獻376條經驗 獲得超318個贊
沒問題啊,調用函數后,執行了i的+1,然后輸出肯定為1啊,后面經過判斷,不符合條件繼續向下,然后每隔一秒調用一次a函數,當i為5時依然不符合退出條件,會再執行一次a,先輸出6,再退出執行,而i==5,在i等于5時直接就退出了,沒有6了
添加回答
舉報