这个JavaScript方法很神奇,请问为什么?
天蓬老师
天蓬老师 2017-04-11 11:09:39
[JavaScript讨论组]
function getAim(items, aim) {
    if (items == null)
        return;
    for (var i = 0; i < items.length; i++) {
        if (items[i].id == aim && items[i].childrens != null && items[i].childrens.length > 0) {
            return items[i];  //这行执行后i还会再++,已经返回了,循环还在继续。为什么?
        }
        else if (items[i].childrens != null && items[i].childrens.length > 0) {
            getAim(items[i].childrens, aim);
        }
    }
}

这个方法是递归找子节点中id = aim的那个节点。 return items[i] 这行代码找到后返回,返回后程序还是执行了i++,知道循环完毕,我都return了,怎么还会执行啊。怎么改呢?

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(4)
高洛峰

没有运行,我大概猜一下。

应该是因为递归套了很多层了,当前这一层递归找到了结果,然后return了,但是调用栈后面还有递归套着呢,当然还要继续搜索下去,直到最后把以你输入的DOM为根的子树搜完为止。

这段递归现在的终止条件是,当前叶元素为空的时候就会停止前进。
所以它会把整个子树搜索完毕,而且你的结果好像还不能传递到最外面去。

那么你需要做的就是再增加一个终止条件,这个条件就是当搜索到目标的时候停止循环,并把结果返回上一层递归。那么这样的话,仔细观察这段代码,应该怎么改造呢?

当前递归搜索到结果,和没有搜索到结果的区别在哪里?
区别在于,一个返回了目标元素,一个返回了undefined
那么只要这样就行了:

function getAim(items, aim) {
    let ans = viod 0;
    if (items == null)
        return;
    for (var i = 0; i < items.length; i++) {
        if (items[i].id == aim && items[i].childrens != null && items[i].childrens.length > 0) {
            return items[i];
        }
        else if (items[i].childrens != null && items[i].childrens.length > 0) {
            /***改动在这里***/
            ans = getAim(items[i].childrens, aim);
            if (ans) {
                return (ans);
            }
            /***改动在这里***/
        }
    }
}

我并没有运行,你自己试试看,思路是没有问题的。

PHPz

return的是递归调用的后面的函数吧。
比如

  • 1.1.1-1.1.5

  • 1.2.1-1.1.5

  • 1.3.1-1.1.5

这么一个dom层级,目标在1.2.3上,对1.2.3遍历的函数被return了,但是对1.2对1这些外层的函数还是要继续执行的呀。
要不加个中间量,比如 var result ='';
return items[i];之前把result置为false之类的。
然后在for循环里根据result的值执行break,把for循环停了。

迷茫

这不是递归么。。。。。return只是当前function返回一个值

巴扎黑

把for里面的写成一个闭包应该没问题吧,剩下的我先试一下。。。
ps:我看明白上面的答案了,就是你递归好多层进去,else那里会有没return结果的地方。。。话说这个我也没有注意到啊。。。

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

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