在网上看到一个习题内容如下:functiongetNode(){varoDiv=document.getElementsByClassName('div4')[0];varparent=findNode(oDiv);returnparent;}functionfindNode(el){varrul=el.parentNode;if(!el||document.documentElement===rul||el===document.documentElement){return;}elseif(rul&&rul.className==='div1'){returnrul;}else{returnfindNode(rul);}}vars1=getNode();console.log(s1.className);递归找出子节点最终的父节点。上边的代码可以得出正常的值;但是如果把returnfindNode(rul);中参数改为returnfindNode(el);就会报错:超过最大调用堆栈大小问题:为什么会出现错误?
2 回答
动漫人物
TA贡献1815条经验 获得超10个赞
在正常执行的时候,el这个东西是findNode的参数,是当前传递过来的元素这个函数的意义在于,判断当前是否是div1了,如果不是,就去递归自己判断自己的父元素,如果改成el的话,这个函数就永远递归判断自己了。递归也是要有方向和结束条件的。"超过最大调用堆栈大小"实际上就是函数发生无限递归了。因为递归过程中参数没有改变
饮歌长啸
TA贡献1951条经验 获得超3个赞
按照你的写法,简化成下面这样。看出来了吗?是个无限循环!递归是有“深度”限制的,超过就会报错:超过最大调用堆栈。在V8引擎中,这个“深度”大小和堆栈以及堆栈帧(保存参数的局部变量)有关。functionfindNode(el){returnfindNode(el);}
添加回答
举报
0/150
提交
取消
