亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

遞歸函數的問題求大神幫看下!

遞歸函數的問題求大神幫看下!

winner4265975 2017-03-15 23:49:33
為什么一開始輸出的是1后來變為2?
查看完整描述

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,純手打望采納=、=)

查看完整回答
2 反對 回復 2017-03-16
?
西蘭花偉大炮

TA貢獻376條經驗 獲得超318個贊


沒問題啊,調用函數后,執行了i的+1,然后輸出肯定為1啊,后面經過判斷,不符合條件繼續向下,然后每隔一秒調用一次a函數,當i為5時依然不符合退出條件,會再執行一次a,先輸出6,再退出執行,而i==5,在i等于5時直接就退出了,沒有6了

查看完整回答
2 反對 回復 2017-03-15
?
we456634

TA貢獻3條經驗 獲得超0個贊

始輸出的是1后來變為2

查看完整回答
反對 回復 2017-03-16
  • 3 回答
  • 0 關注
  • 1508 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號