javascript - 请问,这个方法(递归)为什么会导致内存溢出?
PHP中文网
PHP中文网 2017-04-11 09:05:08
[JavaScript讨论组]
function getClosestOperator($source) {

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

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

        if($closestOperator.length == 0) {

            getClosestOperator($closestContainer);

        } else {

            return $closestOperator

        }

    };
    


PHP中文网
PHP中文网

认证0级讲师

全部回复(5)
阿神

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

function getClosestOperator($source) {

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

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

       return getClosestOperator($closestContainer);

    } else {

        return $closestOperator

    }

};
伊谢尔伦

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

PHPz

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

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

PHP中文网

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

PHPz

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号