我正在阅读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作为值传递给3,那么它将从2开始,并且它大于0,然后调用重复。这就是我陷入困境的地方,因为在我看来,这在我看来是从2开始的,需要帮助如何在输出的过程中穿行。
谢谢
发布于 2016-09-08 11:04:07
如果我将3作为值传递给3,那么它将从2开始,并且它大于0,然后调用重复。
是的,它先叫repeat(2, fn)。但这并不意味着第一个输出将是"2",只意味着它将进一步递归到repeat(1, fn),直到repeat(0, fn)。只有在那之后,它才会调用fn(1),在所有的fn(2)之后,并且最终只调用fn(3)。
如果使用? (fn(num), repeat(num - 1), fn)),则顺序将有所不同。
发布于 2016-09-08 10:50:46
它可能有助于扩展三元操作符:
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)。
希望这能有所帮助。
https://stackoverflow.com/questions/39388923
复制相似问题