请问,这个方法(递归)为什么会导致内存溢出?

function getClosestOperator($source) {

        var $closestContainer = $source.closest('div.tableStyle-2-container');

        var $closestOperator = $closestContainer.children('div.tableStyle-2-operator');

        if($closestOperator.length == 0) {

            getClosestOperator($closestContainer);

        } else {

            return $closestOperator

        }

    };
    


clipboard.png

阅读 5k
5 个回答

$closestContainer是空数组的时候,$closestOperator.length就是0,而且在递归也是一样。

function getClosestOperator($source) {

    var $closestContainer = $source.closest('div.tableStyle-2-container');

    var $closestOperator = $closestContainer.children('div.tableStyle-2-operator');
    
    if(!$closestContainer.length)return null;
    
    if($closestOperator.length == 0) {

       return getClosestOperator($closestContainer);

    } else {

        return $closestOperator

    }

};

估计是你的递归没有达到终止条件,就是一直运行不到else条件里面。然后一直递归下去。递归深度越来越大。最后导致栈溢出。

这个好像是个死循环吧...找到父亲,然后找到父亲的儿子,然后把儿子交给递归,递归又继续找儿子的父亲、父亲的儿子...一直来来回回都是同样的父亲,儿子,怎么走出递归?

噢,看错了,是把父亲交给了递归...,请忽略本条答案- -

测试了下,正像scort说的当找不到父节点时container变成了[]而之后对[]的任何查找操作不论是找operator还是继续找上级父节点返回的都是[]
[].length =0 所以你的递归调用一单找不到父节点后会进入无限循环,而浏览器对递归调用的次数是有限制的,所以就抛出递归超出最大次数。

找到答案了,jQuery closest方法是从自身开始往上遍历的,而第二次开始递归的起点就是$closestContainer本身,所以就导致了无限循环找到它自己

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题