不理解带闭包的递归函数的返回行为

时间:2016-10-25 22:16:30

标签: recursion return closures

我的编程“技能”的基础正在震动..我不知道这种行为是否是由递归,闭包或其他东西引起的,但这是迄今为止我见过的最奇怪的事情。

我的初衷是使用递归来计算dom元素的父级。实现闭包以存储我的计数器,并且递归将为不等于div#wrapper的每个父项增加它。它有效 - 一次。对于第一个元素(只有1个父元素 - 它返回1)但是第二个元素返回undefined。为了测试我想出了这个装备:

let parents = countParents();
let pathLength = parents(3);

function countParents() {
    let counter = 0;
    return function nextParent(node) {
        let parent = node - 1;
        counter++;
        if (parent === 1)
            return 'WATAFAK';
        else
            nextParent(parent);
    }
}

console.log(pathLength);

我实际上正在质疑我的眼睛(已经很晚了,现在已经编程了一段时间),但这个函数返回undefined。怎么可能?

1 个答案:

答案 0 :(得分:1)

function countParents() {
    let counter = 0;
    return function nextParent(node) {
        let parent = node - 1;
        counter++;
        if (parent === 1)
            return 'WATAFAK';
        else
            nextParent(parent); // call nextParent(parent) and throw away result
        return undefined;       // invisible line in every function
    }

    return undefined;           // invisible line in every function (never reached)
}

如果您希望将递归的结果作为结果,则必须在其前面添加return。它是如何现在只是副作用,它几乎是死代码。

由于else分支没有返回,所有函数在其块结束之前都有一个不可见的return undefined,