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

JavaScript递归中的作用域问题?

JavaScript递归中的作用域问题?

哈士奇WWW 2019-05-12 11:03:02
在网上看到一个习题内容如下: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的话,这个函数就永远递归判断自己了。
递归也是要有方向和结束条件的。"超过最大调用堆栈大小"实际上就是函数发生无限递归了。因为递归过程中参数没有改变
                            
查看完整回答
反对 回复 2019-05-12
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

按照你的写法,简化成下面这样。看出来了吗?是个无限循环!递归是有“深度”限制的,超过就会报错:超过最大调用堆栈。在V8引擎中,这个“深度”大小和堆栈以及堆栈帧(保存参数的局部变量)有关。
functionfindNode(el){
returnfindNode(el);
}
                            
查看完整回答
反对 回复 2019-05-12
  • 2 回答
  • 0 关注
  • 665 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号