为什么我的代码打印出来部分节点没有按顺序显示,且前面星号数量不对?

来源: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回答

好帮手慕久久

2020-04-28

同学你好,问题解答如下:

1. 星号个数不对,是因为在for循环遍历节点、并进行递归调用bianli方法时,在方法中将参数a进行了+=操作,如下:

http://img.mukewang.com/climg/5ea82e9c090b183905290138.jpg

所以*的数量不对。

2. 顺序问题是因为同学将“document.write(shuchu);”写在了bianli方法中,以下面的结构为例:

http://img.mukewang.com/climg/5ea82bc70903fd5006060677.jpg

第一次,传入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”。

按照上面的解释,代码需要修改成如下样子:

http://img.mukewang.com/climg/5ea830990915487b06060528.jpg

递归是非常难、且不好理解的地方,同学不用深抠,了解即可。

如果我的回答帮到了你,欢迎采纳,祝学习愉快!


1

0 学习 · 40143 问题

查看课程