Codewars 解决方案 - 相互嵌套的函数

Typ*_*veN 11 javascript codewars

我正在寻找一个关于 codewars 的谜题的解决方案,但我不明白它为什么有效。减号()是如何工作的?

function makeNum(num, func) {
    if (func === undefined) {
        return num;
    } else {
        return func(num);
    }
}

function three(func) {
    return makeNum(3, func);
}

function eight(func) {
    return makeNum(8, func);
}

function minus(right) {
    return function(left) {
        return left - right;
    };
}

console.log(eight(minus(three()))); // will log out 5
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 7

这有点复杂。:-)

console.log(eight(minus(three()))); 是由内而外的,所以让我们来看看:

  • three()- 调用makeNum(3, undefined)并返回它返回的内容。makeNum(3, undefined)回报3,所以这是返回值。
  • minus(3)- 调用minus,传入3as rightminus返回一个关闭的新函数right
  • eight(...)- 调用makeNum(8, fnFromMinus)wherefnFromMinus是由 返回的函数minus(3)makeNum(8, fnFromMinus)确实fnFromMinus8作为传入leftfnFromMinus返回的结果left - right(记住right3fnFromMinus关闭它)。

由于8 - 35,最终结果是5,它console.log返回。

这是一个检测版本:

let indent = 0;
function show(label) {
    console.log(" ".repeat(indent * 4) + label);
}
function fname(fn) {
    return fn ? fn.name : "undefined";
}

function makeNum(num, func) {
    const descr = `makeNum(${num}, ${fname(func)})`;
    show(descr);
    ++indent;
    if (func === undefined) {
        --indent;
        show(`${descr} returns ${num}`);
        return num;
    } else {
        const rv = func(num);
        --indent;
        show(`${descr} returns ${num}`);
        return rv;
    }
}

function three(func) {
    const descr = `three(${fname(func)})`;
    console.log(descr);
    ++indent;
    const rv = makeNum(3, func);
    --indent;
    show(descr + ` returns ${rv}`);
    return rv;
}

function eight(func) {
    const descr = `eight(${fname(func)})`;
    console.log(descr);
    ++indent;
    const rv = makeNum(8, func);
    --indent;
    show(descr + ` returns ${rv}`);
    return rv;
}

function minus(right) {
    const fn = function fnFromMinus(left) {
        show(`${fname(fn)} returns ${left} - ${right} = ${left - right}`);
        return left - right;
    };
    try {
        // For browsers that don't do `name` properly
        fn.name = "fnFromMinus";
    } catch (e) { }
    show(`minus(${right}) returns ${fname(fn)}`);
    return fn;
}

console.log(eight(minus(three()))); // will log out 5
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper {
    max-height: 100% !important;£
}
Run Code Online (Sandbox Code Playgroud)