为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

winner4265975 2017-03-15 23:49:33
为什么一开始输出的是1后来变为2?
查看完整描述

3 回答

已采纳
?
千秋此意

TA贡献158条经验 获得超187个赞

其实你在问题不在于递归,关于结果为什么是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 关注
  • 1434 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信