Closed. This question needs details or clarity。它当前不接受答案。












想改善这个问题吗?添加详细信息,并通过editing this post阐明问题。

在11个月前关闭。



Improve this question




我一直在寻找解决代码战难题的解决方案,但我不明白为什么会起作用。 minus()如何工作?

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

最佳答案

这有点复杂。 :-)
console.log(eight(minus(three())));是由内而外运行的,因此让我们按照以下步骤进行操作:

  • three()-调用makeNum(3, undefined)并返回它返回的内容。 makeNum(3, undefined)返回3,这就是返回值。
  • minus(3)-调用minus,将3作为right传递。 minus返回一个关闭right的新函数。
  • eight(...)-调用makeNum(8, fnFromMinus),其中fnFromMinusminus(3)返回的函数。 makeNum(8, fnFromMinus)执行fnFromMinus,将8作为left传递。 fnFromMinus返回left - right的结果(请记住right3fnFromMinus在其上封闭)。

  • 由于8 - 35,最终结果是5console.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
    .as-console-wrapper {
        max-height: 100% !important;£
    }

    08-07 13:09