我正在阅读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开始,需要帮助来了解如何通过输出就是这样的。
谢谢
答案 0 :(得分:2)
扩展三元运算符可能会有所帮助:
const repeat = (num, fn) => {
if (num > 0) {
repeat(num -1, fn);
return fn(num);
} else {
return undefined;
}
}
在第4行,您可以看到使用fn
:num
调用了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))
,订单会有所不同。