为什么我的代码打印出来部分节点没有按顺序显示,且前面星号数量不对?
来源:7-7 编程练习
慕瓜6072901
2020-04-28 16:27:49
function bianli(a,b){
var name,shuchu="";
if(b.tagName){
name=b.tagName;
shuchu+=a+name+"<br/>";
}
var len=b.childNodes.length;
for(var i=0;i<len;i++){
bianli(a+="*",b.childNodes[i]);
}
document.write(shuchu);
}
bianli("*",document);
1回答
同学你好,问题解答如下:
1. 星号个数不对,是因为在for循环遍历节点、并进行递归调用bianli方法时,在方法中将参数a进行了+=操作,如下:
所以*的数量不对。
2. 顺序问题是因为同学将“document.write(shuchu);”写在了bianli方法中,以下面的结构为例:
第一次,传入document,由于document没有tagName属性,所以不执行if语句,往下执行,len=2,开始for循环:
i=0,调用bianli方法,第一个参数a,执行a+=“*”,a=“**”,第二个参数是<!DOCTYPE html>,由于<!DOCTYPE html>的tagName是undefined,并且没有子元素,所以不会继续循环,执行打印,打印的内容为空。
i=1,继续调用bianli方法,第一个参数a,执行a+=“*”,a=“***”,第二个参数是html,html有tagName,所以执行if语句,shuchu=“***HTML”,往下执行len=3(因为有空白节点,html的子节点为head、text、body),进入for循环:
i=0,调用bianli方法,第一个参数a,执行后为a=“****”,第二个参数为head,由于head有tagName,所以shuchu=“ ****HEAD”, 往下执行,len=3(节点为:text, meta, text),进入循环:
第一次循环,执行bianli,第一个参数a=“*****”, 第二个参数为空白text节点,打印空;第二次循环,执行bianli,传入节点为meta,参数a执行后为“******”,由于meta有tagName,所以最先打印出来,打印内容为“******META”;第三次循环,空白节点,打印空。
然后从最里层逐层往外,再打印出” ****HEAD”。
i=1,调用bianli方法,由于该空白text节点,是和head节点同级的,所以a初始值是“****”,执行后,变成“*****”,由于空白text没有tagName和子节点,所以不执行if语句和循环,打印空。
i=2,调用bianli方法,第一个参数a,执行a+=“*”,a=“******” ,第二个参数是body,body有tagName,所以shuchu=“******BODY”,再执行len、循环,依次类推,最后先打印出最里层的script,逐层往外打印......然后是“******BODY”,最后是***HTML”。
按照上面的解释,代码需要修改成如下样子:
递归是非常难、且不好理解的地方,同学不用深抠,了解即可。
如果我的回答帮到了你,欢迎采纳,祝学习愉快!
相似问题