鍍金池/ 問(wèn)答/HTML/ JavaScript遞歸中的作用域問(wèn)題?

JavaScript遞歸中的作用域問(wèn)題?

在網(wǎng)上看到一個(gè)習(xí)題內(nèi)容如下:

<body>
    <div class='div1'>
        <div class='div2'>
            <div class='div3'>
                <div class='div4'></div>
            </div>
        </div>
    </div>
    <script>
        function getNode(){
            var oDiv = document.getElementsByClassName('div4')[0];
            var parent = findNode(oDiv); 
            return parent;
        }
        function findNode(el){
            var rul = el.parentNode;
            
            if (!el || document.documentElement === rul || el === document.documentElement )
            {
                return;
            }else if (rul && rul.className === 'div1')
            {
                return rul;
            }else {
                return findNode(rul);
            }
        }
        var s1 = getNode();
        console.log(s1.className);
    </script>
 </body>

遞歸找出子節(jié)點(diǎn)最終的父節(jié)點(diǎn)。上邊的代碼可以得出正常的值;但是如果把

return findNode(rul);中參數(shù)改為return findNode(el);

就會(huì)報(bào)錯(cuò):超過(guò)最大調(diào)用堆棧大小
問(wèn)題:為什么會(huì)出現(xiàn)錯(cuò)誤?

回答
編輯回答
笨笨噠

在正常執(zhí)行的時(shí)候,el這個(gè)東西是findNode的參數(shù),是當(dāng)前傳遞過(guò)來(lái)的元素
這個(gè)函數(shù)的意義在于,判斷當(dāng)前是否是div1了,如果不是,就去遞歸自己判斷自己的父元素,
如果改成el的話,這個(gè)函數(shù)就永遠(yuǎn)遞歸判斷自己了。

遞歸也是要有方向和結(jié)束條件的。
"超過(guò)最大調(diào)用堆棧大小"實(shí)際上就是函數(shù)發(fā)生無(wú)限遞歸了。因?yàn)檫f歸過(guò)程中參數(shù)沒有改變

2017年4月5日 02:19
編輯回答
別瞎鬧

按照你的寫法,簡(jiǎn)化成下面這樣。 看出來(lái)了嗎?是個(gè)無(wú)限循環(huán)!遞歸是有“深度”限制的,超過(guò)就會(huì)報(bào)錯(cuò):超過(guò)最大調(diào)用堆棧。 在V8引擎中,這個(gè)“深度”大小和堆棧以及堆棧幀(保存參數(shù)的局部變量)有關(guān)。

function findNode(el){
    return findNode(el);
}
2017年2月7日 16:44