簡體   English   中英

理解高階 JavaScript 函數

[英]Understanding higher order JavaScript functions

我正在從 Eloquent JavaScript 學習高階函數,我對類似的問題進行了研究,但找不到它。 有一個與我的相同主題和相同章節的類似問題,但這是一個基本問題。 這是類似的鏈接: 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. 這個高階函數是如何工作的?
  2. 循環如何工作以確定數字是偶數還是奇數?
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));

高階函數要么接受一個函數作為參數,要么返回一個函數; unlessrepeat接受函數作為參數。

repeat接受一個數字和一個函數,並簡單地調用傳遞給它的任何函數,次數。

unless接受一個值和一個函數; 如果值為假,則將調用該函數。

這表明函數可以像任何其他變量一樣傳遞:在repeat()內部, action指的是函數本身, action()調用該函數以獲取其結果。

什么是高階函數?

其操作上的其他功能,無論是把他們作為參數通過返回它們的功能,被稱為高階函數。

讓我從一個小例子開始,然后我們回到問題中的問題。

 function evenNumberFilter(number) { return number%2==0 } function oddNumberFilter(number) { return !evenNumberFilter(number) } evenNumberFilter(2) // true oddNumberFilter(3) // true

現在我們知道是否調用函數

  1. evenNumberFilterparameter X如果它是偶數,它將返回true
  2. parameter X oddNumberFilter如果是奇數則返回true

讓我們擴展問題並說

  1. "I would like to have all even numbers till number 10"
  2. "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循環的方式迭代
  2. 結果附加到數組的方式
  3. 在函數結束時返回的結果。

這兩個函數之間的唯一區別是,它對evenNumberFilteroddNumberFilter操作的filter

那么我們可以重構代碼並編寫一個可以將謂詞作為參數的通用filter函數嗎?

謂詞:布爾值函數P: X? {true, false} P: X? {true, false}

在我們的例子中, evenNumberFilteroddNumberFilter都是謂詞

 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`); });

當用true調用除非, then它不會執行then函數,因此不會打印日志

當除非是調用falsethen它會執行then函數打印記錄

一般來說,你的除非函數聽起來像 - 接受條件,測試它,然后運行回調。 重復功能聽起來像運行動作 n 次。 結果聽起來像運行操作,並檢查內部是否滿足條件,然后運行除非功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM