javascript递归时出现死循环,该如何解决

问题描述

function Condition(tagName,attrName,attrValue){this.tagName=tagName;this.middleStart="<tag-name name="&quot;&quot;+tagName+&quot;&quot;">";this.middleEnd="</tag-name>"this.child=null;this.childResult="";}Condition.prototype.addChild=function(childCondition){this.child=childCondition;this.childResult=this.child.showXml();}Condition.prototype.getChild=function(){if(this.child==null){return this;}else{return this.getChild();//这里是递归}}Condition.prototype.showXml=function(){return this.middleStart+this.childResult+this.middleEnd;}function test1(){var con=new Condition("table",null,null);var con1=new Condition("tr",null,null);var con2=new Condition("td",null,null);var child1=con.getChild();child1.addChild(con1);var child2=con.getChild();child2.addChild(con2);var child3=con.getChild();alert(con.showXml());} 问题补充:这个程序的功能主要是向服务器端的xml文件写入数据,这个xml文件里面描述了html页面的元素结构,比如html文件是这样:,则对应的此xml文件则是:<tag-name name="table"> <tag-attribute attributename="border">1</tag-attribute> <tag-name name="tr"> <tag-name name="td"> </tag-name></tag-name>该xml文件是在服务器端读取后封装成HtmlParser框架过滤网页内容时用的条件,以上的javascript代码就是用来生成这个XML文件的,因为HTML页面的层次有很多层,需要描述任意层次的HTML节点关系

解决方案

楼主那样实现的话逻辑会有点问题,刚才写了一段代码,可以实现楼主所说的功能,供楼主作一个参考吧:/**标签元素类._atts是由{attName:'name',attValue:'value'}形式的对象组成的数组.*/function Element(_tagName,_atts){this.tagName=_tagName;//标签名.this.atts=_atts||[];//属性.this.childNodes=[];//子标签.}/**添加子节点._element:子节点,Element类的对象.*/Element.prototype.appendChild=function(_element){this.childNodes.push(_element);}/**给元素添加属性._attName:属性名,_attValue:属性值.*/Element.prototype.addAttribute=function(_attName,_attValue){this.atts.push({attName:_attName,attValue:_attValue});}/**将Element对象转换为XML形式的字符串.*/Element.prototype.parseToXML=function(){var xml=[];xml.push("<tag-name name=""+this.tagName+"">");for(var i=0;i<this.atts.length;i++){//遍历所有属性.xml.push("<tag-attribute attributeName=""+this.atts[i].attName+"">"+this.atts[i].attValue+"<tag-attribute>");}for(var i=0;i<this.childNodes.length;i++){xml.push(this.childNodes[i].parseToXML());//递归遍历子节点.}xml.push("</tag-name>");return xml.join("n");//组成字符串并返回.}调用方法如下:var body=new Element("BODY");var table=new Element("TABLE",[{attName:"border",attValue:"0"},{attName:"width",attValue:"100%"}]);var tr = new Element("TR");var td = new Element("TD");td.addAttribute("border","1px");td.addAttribute("gbColor","red");tr.appendChild(td);table.appendChild(tr);body.appendChild(table);alert(body.parseToXML());//输出xml字符串
解决方案二:
ggmmaallee .......yes, I think you are right.
解决方案三:
# Condition.prototype.getChild=function() # { # if(this.child==null) # { # return this; # } # else # { # return this.getChild();//这里是递归 # } # } 这个只要你call一个就会死循环了,自己call自己,应该是this.child.getChild()
解决方案四:
无限递归的根源在这里:return this.child.getChild();//这里是递归...不过按照我的逻辑,在getChild()里面使用递归貌似没有任何意义.楼主能不能说明一下想用这段代码是想实现什么样的效果?
解决方案五:
而且你的: Condition.prototype.showXml=function() { return this.middleStart+this.childResult+this.middleEnd; } 也不对吧
解决方案六:
递归那好像应该用: return this.child.getChild();//这里是递归

时间: 2024-09-20 00:31:02

javascript递归时出现死循环,该如何解决的相关文章

javascript递归回溯法解八皇后问题

  javascript递归回溯法解八皇后问题:           网上看到许多关于八皇后算法的文章,很少能看到使用javascript来实现的,今天就给大家使用javascript来解决下这个问题,有需要的小伙伴可以参考下. 下面给大家分享的是回溯法解八皇后, 带详细注解,这里就不多废话了. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

JavaScript递归操作实例浅析_javascript技巧

本文实例分析了JavaScript递归操作.分享给大家供大家参考,具体如下: 问题 一个简单的递归,求n的阶乘: function factorial(n){ if (n<=1) { return 1; }else{ return factorial(n-1)*n; } } 如果像下面这样使用它,则会出错: var fcopy = factorial; factorial = null; alert(fcopy(3)); 因为fcopy指向的函数实体调用了factorial,而factorial

java-两个互相引用的类,用工厂模式创建时,死循环的问题

问题描述 两个互相引用的类,用工厂模式创建时,死循环的问题 假设有电脑.人 这么两个类如图所示.class person{ computer myComputer;} class computer{ person myOwner;} 用工厂模式 如果我要创造小明这个人,那么我要用人的工厂去创造小明,在创造的时候我要set他有个HP电脑,那么我又要用电脑工厂去创造HP电脑.但是创造HP电脑的时候我又要去用人的工厂创造小明这个人,这不就是循环下去了吗?所以我纳闷了,1要么这样设计类是不正确的,2要么

JavaScript开发时的五个注意事项_javascript技巧

只在<form>元素上使用submit事件 如果要在form中绑定事件处理程序时,应该只在<form>元素上绑定submit事件,而不是给提交按钮绑定click事件. March:这个方式固然很好,但是,公司开发时使用了Web Flow,一个页面就一个大form,而里面可能有若干个提交按钮,所以不得不把部分事件处理程序绑定在了提交按钮的click事件上. 可点击的都应该是链接 不要给除锚元素(<a>)以外的元素绑定click事件.这一点对于键盘用户很重要,因为他们在仅通

使用Wordpress插件时出现中文乱码的解决方法

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 用wordpress建网站的好处就在于,可以使用N多主题和N多的插件,由于wordpress在国外的使用时期较长,很多插件都是国外的用户开发的.对于中文的支持不是很好.经常使用WP一定会遇到插件编码问题,今天影子给大家讲一下关于使用wordpress插件时出现中文乱码的解决方法. 一.起因: 今天就遇到一个插件,输入中文后,保存,查看,显示输

安装了多版本office启动时需要重新配置如何解决

  安装了多版本office启动时需要重新配置如何解决         ①在开始菜单--所有程序--Microsoft Office文件夹里面可以看到小编的本本安装了三个版本,是为了截图方便各个版本的使用者. ②我启动Word2010,就会出现重新配置的界面,很耽误时间,而且每次都这样,要知道小编的时间可是十分宝贵的. ③下面教大家一个十分简单的解决办法,按下Win+R打开运行对话框,输入下面的指定. 命令1(用于Office 2003): reg add HKCUSoftwareMicroso

win8系统安装Office时提示”错误1911“的解决方法

win8系统安装Office时提示"错误1911"的解决方法 1.看到安装的过程中,一个名为INKDIV.dll的动态库文件无法正常完成注册.说明之前Office程序的参与还在,需要清理一下; 2.这个问题比较普遍,这是Office程序特有的故障,而且微软也有专用工具用以处理这样的问题.这个专用工具,是一个全英文的程序,但是操作还是比较简单的.首先下载工具.解压.百度云网盘分享路径是:全部文件 > 维护电脑 > 清理卸载 > [微软专用卸载工具]地址:http://p

IE11打开网页时总是未有响应怎么解决

  有些时候使用ie11浏览器时,总是碰到ie11浏览器出现无响应或者不管打开什么网站都是404报错,这时就很有可能是ie11浏览器设置的问题了,那么要怎么办了,其实很简单,把ie11浏览器的设置重置一遍就好了. ie11打开网页时总是未有响应的解决方法 1.点击小编红框编辑位置的"齿轮": 2.点击"internet选项": 3.然后找到高级,然后点击重置: 4.勾选好"删除个人设置",点击重置:

Win8系统笔记本创建WiFi时提示错误1061的解决方法

Win8系统笔记本创建WiFi时提示错误1061的解决方法   解决方法如下: 1.检查笔记本电源是否连上,接上电源看是否能启用wifi共享服务. 2.设备管理-网络适配器 里面将驱动程序升级到最新(如果装的是win8驱动一般是最新的),再尝试启用共享. 3.如果前两步还没有解决,仍然提示错误1061,你就试试最麻烦的一步:准备杀毒吧. windows7教程 windows8教程 windows10教程