JS高阶混乱

时间:2016-09-08 10:46:43

标签: javascript

我正在阅读JavaScript Alonge,第一个高阶函数让我感到困惑,并在理解输出以及为什么会这样做时寻求帮助。

const repeat = (num, fn) =>
    (num > 0)
        ? (repeat(num - 1), fn), fn(num))
        : undefined

repeat(3, function(n) {
    console.log(`Hello ${n}`)
})

输出结果为:

Hello 1
Hello 2
Hello 3
undefined

我的困惑是,如果我将3输入作为值并且它大于0然后再次调用重复,我会期望它将从2开始。这就是我陷入困境的地方,因为在我看来,这似乎是从2开始,需要帮助来了解如何通过输出就是这样的。

谢谢

2 个答案:

答案 0 :(得分:2)

扩展三元运算符可能会有所帮助:

const repeat = (num, fn) => {
    if (num > 0) {
        repeat(num -1, fn);
        return fn(num);
    } else {
        return undefined;
    }
}

在第4行,您可以看到使用fnnum调用了fn(num);。这行代码将针对包含num的每个3执行。

此外,因为首先对repeat进行递归调用,所以结果会计数(1 - > 3)。如果您要撤消订单,那么它将倒计时(3 - > 1)。

希望这有帮助。

答案 1 :(得分:1)

  

如果我将3输入作为值并且大于0然后再次调用重复,我希望它从2开始。

是的,它首先调用repeat(2, fn)。但这并不意味着第一个输出将是“2”,只是它会进一步递归repeat(1, fn)直到repeat(0, fn)。只有在此之后,它才会在所有fn(1)之后调用fn(2),并且仅在最后fn(3)中调用。

如果使用? (fn(num), repeat(num - 1), fn)),订单会有所不同。