我正在学习Eloquent JavaScript中的高阶函数,我研究了一个类似的问题,但找不到它。在同一个主题和同一章中,有一个类似的问题与我有关,但它是一个基本的问题。这里是一个类似问题的链接:Higher-order functions in Javascript。
我遇到了下面代码的问题:
function repeat(n, action) {
for (let i = 0; i < n; i++) {
action(i);
}
}
let unless = (test, then) => {
if(!test)then();
};
repeat(3, n => {
unless(n%2 == 1, () => {
console.log(`${n} is even`);
});
});
// Output:
/ → 0 is even
// → 2 is even
字符串
1.这个高阶函数是如何工作的?
1.循环是如何工作的,以确定数字是偶数还是奇数?
5条答案
按热度按时间ha5z0ras1#
高阶函数要么接受函数作为参数,要么返回函数;
unless
和repeat
都接受函数作为参数。repeat
接受一个数字和一个函数,并简单地调用传递给它的任何函数,该次数。unless
接受一个值和一个函数;如果值为false,则调用该函数。这表明函数可以像其他变量一样传递:在
repeat()
中,action
引用函数本身,action()
调用该函数以获取其结果。px9o7tmv2#
什么是高阶函数?
对其他函数进行操作的函数,或者通过将它们作为参数或者通过返回它们,被称为高阶函数。
让我从一个小例子开始,然后我们回到问题中的问题。
字符串
现在我们知道如果我们调用函数
evenNumberFilter
与parameter X
如果是偶数,则返回true
oddNumberFilter
与parameter X
如果是奇数,则返回true
让我们把这个问题扩展一下,
"I would like to have all even numbers till number 10"
个"I would like to have all odd numbers till number 10"
个型
如果我们看一下
evenNumberBeforeTen
和oddNumberBeforeTen
的代码,1.将结果追加到数组的方式
1.在函数结束时返回的结果。
这两个函数之间的唯一区别是,
filter
在evenNumberFilter
或oddNumberFilter
上运行。那么,我们可以重构代码并编写一个可以将** predicate **作为参数的通用
filter
函数吗?Predicate:布尔值函数
P: X? {true, false}
。在我们的例子中,
evenNumberFilter
和oddNumberFilter
都是 predicate型
现在,在上面的例子中,函数
filter
是高阶函数,因为它将函数predicate
作为参数。让我们来研究一下你在问题中提到的问题。
repeat
是一个高阶函数,它以number
和函数action
为参数。unless
是一个高阶函数,它以boolean
和函数then
为参数当你执行
型
repeat
首先被调用,然后它将执行3次以下的函数。型
1.当上面的函数被调用时,参数为0,1,2。它调用
unless
函数,布尔值为n%2==1
,布尔值为true
或false
,下面的函数作为参数。型
当使用
true
和then
调用unless时,它不会执行then
函数,因此不会打印日志当使用
false
和then
调用unless时,它将执行打印日志的then
函数juzqafwq3#
字符串
n是您希望执行
action
函数的次数。action
函数在这里被称为回调函数如果你做
repeat(5, console.log)
,你会得到:型
你也可以像这样执行另一个
function
型
q35jwt9p4#
//从这个问题,可以使用map吗?
字符串
//可以用map来实现吗
//而不是使用一个if语句请你解释一下
//这就是我的意思
型
kupeojn65#
一般来说,ur unless function听起来像-获取条件,测试它,然后运行回调。repeat func听起来像run action(s)n次。结果听起来像run action(s),并检查内部是否满足条件,然后运行unless function。