angularjs 了解高阶JavaScript函数

8i9zcol2  于 7个月前  发布在  Angular
关注(0)|答案(5)|浏览(79)

我正在学习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.循环是如何工作的,以确定数字是偶数还是奇数?

ha5z0ras

ha5z0ras1#

高阶函数要么接受函数作为参数,要么返回函数; unlessrepeat都接受函数作为参数。
repeat接受一个数字和一个函数,并简单地调用传递给它的任何函数,该次数。
unless接受一个值和一个函数;如果值为false,则调用该函数。
这表明函数可以像其他变量一样传递:在repeat()中,action引用函数本身,action()调用该函数以获取其结果。

px9o7tmv

px9o7tmv2#

什么是高阶函数?
对其他函数进行操作的函数,或者通过将它们作为参数或者通过返回它们,被称为高阶函数。
让我从一个小例子开始,然后我们回到问题中的问题。

function evenNumberFilter(number) {
  return number%2==0
}

function oddNumberFilter(number) {
  return !evenNumberFilter(number)
}

evenNumberFilter(2) // true
oddNumberFilter(3)  // true

字符串
现在我们知道如果我们调用函数

  1. evenNumberFilterparameter X如果是偶数,则返回true
  2. oddNumberFilterparameter X如果是奇数,则返回true
    让我们把这个问题扩展一下,
  3. "I would like to have all even numbers till number 10"
  4. "I would like to have all odd numbers till number 10"
function evenNumberFilter(number) {
  return number %2 == 0
}

function oddNumberFilter(number) {
  return !evenNumberFilter(number)
}

function evenNumberBeforeTen() {
  const result = []
  for(number=0; number<10; number++) {
    if (evenNumberFilter(number)) {
      result.push(number)
    }
  }
  return result
}

function oddNumberBeforeTen() {
  const result = []
  for(number=0; number<10; number++) {
    if (oddNumberFilter(number)) {
      result.push(number)
    }
  }
  return result
}

evenNumberBeforeTen();  //[0,2,4,6,8]
oddNumberBeforeTen();   //[1,3,5,7,9]


如果我们看一下evenNumberBeforeTenoddNumberBeforeTen的代码,

  1. for循环的方式是迭代
    1.将结果追加到数组的方式
    1.在函数结束时返回的结果。
    这两个函数之间的唯一区别是,filterevenNumberFilteroddNumberFilter上运行。
    那么,我们可以重构代码并编写一个可以将** predicate **作为参数的通用filter函数吗?

Predicate:布尔值函数P: X? {true, false}

在我们的例子中,evenNumberFilteroddNumberFilter都是 predicate

function evenNumberFilter(number) {
  return number %2 == 0
}

function oddNumberFilter(number) {
  return !evenNumberFilter(number)
}

function filter(predicate) {
  const result = []
  for(number=0; number<10; number++) {
    if (predicate(number)) {
      result.push(number)
    }
  }
  return result
}

filter(evenNumberFilter);  //[0,2,4,6,8]
filter(oddNumberFilter);   //[1,3,5,7,9]


现在,在上面的例子中,函数filter是高阶函数,因为它将函数predicate作为参数。
让我们来研究一下你在问题中提到的问题。
repeat是一个高阶函数,它以number和函数action为参数。
unless是一个高阶函数,它以boolean和函数then为参数
当你执行

repeat(3, n => {
  unless(n%2 == 1, () => {
    console.log(`${n} is even`);
  });
});

  1. repeat首先被调用,然后它将执行3次以下的函数。
function (n) => {
  unless(n%2 == 1, () => {
    console.log(`${n} is even`);
});


1.当上面的函数被调用时,参数为0,1,2。它调用unless函数,布尔值为n%2==1,布尔值为truefalse,下面的函数作为参数。

function() => {
  console.log(`${n} is even`);
});


当使用truethen调用unless时,它不会执行then函数,因此不会打印日志
当使用falsethen调用unless时,它将执行打印日志的then函数

juzqafwq

juzqafwq3#

function repeat(n, action) {
 for (let i = 0; i < n; i++) {
   action(i);
 }
}

字符串
n是您希望执行action函数的次数。
action函数在这里被称为回调函数
如果你做repeat(5, console.log),你会得到:

0
1
2
3
4


你也可以像这样执行另一个function

repeat(5, item => console.log(item));

q35jwt9p

q35jwt9p4#

//从这个问题,可以使用map吗?

function evenNumberFilter(number) {
  return number %2 == 0
}
function oddNumberFilter(number) {
  return !evenNumberFilter(number)
}
function filter(predicate) {
  const result = []
  for(number=0; number<10; number++) {
    if (predicate(number)) {
      result.push(number)
    }
  }
  return result
}
filter(evenNumberFilter);  //[0,2,4,6,8]
filter(oddNumberFilter);   //[1,3,5,7,9]

字符串
//可以用map来实现吗
//而不是使用一个if语句请你解释一下
//这就是我的意思

function mapNumber(predicate) {
     let result = [];
     for (let number = 0; number < 10; number++) {
             result.push(predicate(number))**

     }
     return result;
 }

kupeojn6

kupeojn65#

一般来说,ur unless function听起来像-获取条件,测试它,然后运行回调。repeat func听起来像run action(s)n次。结果听起来像run action(s),并检查内部是否满足条件,然后运行unless function。

相关问题