Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 递归函数中的返回不';t退出函数_Javascript_Recursion - Fatal编程技术网

Javascript 递归函数中的返回不';t退出函数

Javascript 递归函数中的返回不';t退出函数,javascript,recursion,Javascript,Recursion,我很难修复我的递归函数,它是一个用于扫描DOM项并在文档中找到匹配元素的简化工具 find: function(selector, element) { if(selector !== undefined) { if(element === undefined) { element = this.e; } var elements = element.childNodes; for(var i = 0

我很难修复我的递归函数,它是一个用于扫描DOM项并在文档中找到匹配元素的简化工具

find: function(selector, element) {
    if(selector !== undefined) {
        if(element === undefined) {
            element = this.e;
        }
        var elements = element.childNodes;
        for(var i = 0; i < elements.length; i++) {
            if(elements[i].nodeType === 1) {
                console.log(elements[i]);
                if(this.has_class(selector, elements[i]) === true) {
                    console.log('YAY, found it', elements[i]);
                    return elements[i];
                } else {
                    if(elements[i].childNodes.length > 0) {
                        this.find(selector, elements[i]);
                    }
                }
            }
        }
    }
    return false;
}
find:函数(选择器、元素){
如果(选择器!==未定义){
如果(元素===未定义){
元素=这个.e;
}
var elements=element.childNodes;
对于(var i=0;i0){
this.find(选择器,元素[i]);
}
}
}
}
}
返回false;
}
所以函数应该扫描给定DOM元素的子元素(可能还有它们的子元素)并返回找到的元素,否则就深入一步再试一次

这是可调试的

正如您在日志中看到的,它触发了console.log('found');但它并没有离开返回它的函数,而是继续并最终返回false(截至NotFound)。怎么能修好呢

var工具={
e:document.querySelector('.breadcrumbs'),
has_类:函数(名称、元素){
if(element.className==名称){
返回true;
}
返回false;
},
查找:函数(选择器、元素){
如果(选择器!==未定义){
如果(元素===未定义){
元素=这个.e;
}
var elements=element.childNodes;
对于(var i=0;i0){
this.find(选择器,元素[i]);
}
}
}
}
}
返回false;
}
};
console.log(tools.find('test'))

俄罗斯-沙特阿拉伯

return
退出对找到元素的
find
的调用,但不会解除所有导致该元素的调用

而不是

this.find(selector, elements[i]);
…在您的
else
中,您需要查看是否已获取元素,如果已获取,请返回:

var result = this.find(selector, elements[i]);
if (result) {
    return result;
}
让它在链条上传播

更新的实时示例:

var工具={
e:document.querySelector('.breadcrumbs'),
has_类:函数(名称、元素){
if(element.className==名称){
返回true;
}
返回false;
},
查找:函数(选择器、元素){
如果(选择器!==未定义){
如果(元素===未定义){
元素=这个.e;
}
var elements=element.childNodes;
对于(var i=0;i0){
var result=this.find(选择器,元素[i]);
如果(结果){
返回结果;
}
}
}
}
}
}
返回false;
}
};
console.log(tools.find('test'))

俄罗斯-沙特阿拉伯

return
退出对找到元素的
find
的调用,但不会解除所有导致该元素的调用

而不是

this.find(selector, elements[i]);
…在您的
else
中,您需要查看是否已获取元素,如果已获取,请返回:

var result = this.find(selector, elements[i]);
if (result) {
    return result;
}
让它在链条上传播

更新的实时示例:

var工具={
e:document.querySelector('.breadcrumbs'),
has_类:函数(名称、元素){
if(element.className==名称){
返回true;
}
返回false;
},
查找:函数(选择器、元素){
如果(选择器!==未定义){
如果(元素===未定义){
元素=这个.e;
}
var elements=element.childNodes;
对于(var i=0;i0){
var result=this.find(选择器,元素[i]);
如果(结果){
返回结果;
}
}
}
}
}
}
返回false;
}
};
console.log(tools.find('test'))

俄罗斯-沙特阿拉伯

find
的递归调用的结果未被处理。您应该检查递归调用的结果值,并在递归调用找到元素时返回其值:

find: function(selector, element) {
    if(selector !== undefined) {
        if(element === undefined) {
            element = this.e;
        }
        var elements = element.childNodes;
        for(var i = 0; i < elements.length; i++) {
            if(elements[i].nodeType === 1) {
                console.log(elements[i]);
                if(this.has_class(selector, elements[i]) === true) {
                    console.log('YAY, found it', elements[i]);
                    return elements[i];
                } else {
                    var foundElement = this.find(selector, elements[i]);
                    // *** Added this check to return the located element from the recursive call
                    if (foundElement != false) {
                        return foundElement;
                    }
                }
            }
        }
    }
    return false;
}
find:函数(选择器、元素){
如果(选择器!==未定义){
如果(元素===未定义){
元素=这个.e;
}
var elements=element.childNodes;
对于(var i=0;i