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

发布于 2022-09-04 04:31:09 字数 556 浏览 11 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

吐个泡泡 2022-09-11 04:31:09

$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

    }

};
§对你不离不弃 2022-09-11 04:31:09

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

絕版丫頭 2022-09-11 04:31:09

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

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

雾里花 2022-09-11 04:31:09

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

甜警司 2022-09-11 04:31:09

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文