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


11

我一直在寻找解决代码战难题的解决方案,但我不明白为什么会起作用。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


是一个类似的问题,但方法稍有不同,这可能有助于阐明其工作原理
Nick Parsons

1
在通过审核失败后,我已投票决定将其关闭:对我而言,您不了解的内容并不明显。最好进行编辑以解释为什么您认为减号不起作用。
GS-向Monica致歉

Answers:


8

这有点复杂。:-)

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

  • three()-调用makeNum(3, undefined)并返回它返回的内容。makeNum(3, undefined)返回3,所以这就是返回值。
  • minus(3)-呼叫minus3作为传入rightminus返回关闭的新函数right
  • eight(...)-调用makeNum(8, fnFromMinus)where fnFromMinus返回的函数minus(3)makeNum(8, fnFromMinus)确实fnFromMinus8作为传递leftfnFromMinus返回的结果left - right(请记住right3fnFromMinus在其上关闭)。

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

这是测试版本:


2

如果逐步进行操作,实际上并没有那么复杂。让我们从内而外地工作。致电:

three()

没有参数意味着您要传递一个未定义的值作为func。所以就像说:

makeNum(3, undefined)

当makeNum看到func未定义时,它将返回num,即3。

因此,我们将其简化为:

eight(minus(3))

现在让我们看看

minus(3)

评估。minus看到您提供的参数为3,因此它将返回一个可以接受“ left”参数并从中减去我们已经提供的3的函数。它不执行。它只是坐在那里,等待被“ left”参数调用,因此可以从中减去3。

因此,我们将其简化为:

eight(function(left){
    return left - 3;
})

现在让我们看看它是如何评估的。使用func参数调用以下八个函数:

function(left){
    return left - 3;
}

然后,它传递8并将此函数传递给makeNum:

makeNum(8, func)

然后makeNum看到已经提供了func(因此不是未定义的),并将func(num)返回到八个函数,这与传递函数相同:

8 - 3

回到八功能。八个函数接收该值,然后返回它。因此,我们将其简化为:

5

它将记录在控制台中。


0

minus为每次调用返回一个新函数,并捕获传递给它的参数。调用返回的函数时,除了传递给它的任何参数外,它还可以引用调用时传递的参数。这是咖喱JavaScript函数的一种方法。


0

此代码是功能性编程语言(例如js)中的高阶函数示例。Javascript函数被视为对象,它们也可以传递和返回。

高阶函数是接收函数作为参数或返回函数作为输出的函数。

minus返回一个匿名函数一个没有定义名称的函数),基本上是这样的:

function(left) {
        return left - 3; //right = 3
    };

传递给时,该函数eight被调用为func(8),然后给出结果为5


0

另一种查看方式-您可以重写以下行:

console.log(eight(minus(three())));

如:

const threeResult = three(); // = 3
const minusResult = minus(threeResult); // = a function that subtracts 3
const eightResult = eights(minusResult); // = 5
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.