递归函数的问题求大神帮看下!


http://img.mukewang.com/58c961ef0001864202670235.jpg

为什么一开始输出的是1后来变为2?

winner4265975
浏览 1435回答 3
3回答

千秋此意

其实你在问题不在于递归,关于结果为什么是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,纯手打望采纳=、=)

西兰花伟大炮

没问题啊,调用函数后,执行了i的+1,然后输出肯定为1啊,后面经过判断,不符合条件继续向下,然后每隔一秒调用一次a函数,当i为5时依然不符合退出条件,会再执行一次a,先输出6,再退出执行,而i==5,在i等于5时直接就退出了,没有6了

we456634

始输出的是1后来变为2
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript